由于传输数据中需要用到解析json格式,只是解析收到的json数据,并不需要组建json数据,于是开始准备移植我认为最简单的json库cJson,结果放上去之后发现很多不行的地方
1、MT7681从硬件上不支持double类型
2、MT7681的SDK不支持math库,而cJson是需要这个库的!
3、官方的团队已经在下支持cjson了,从mak/MT7681/flags_sta.mk的一个宏就能看出来了!
1 |
FUNCFLAGS += -DCJSON_SUPPORT=0 |
不过目前支持不完善,还不能用!
所以只好放弃了!
然后开始寻找其他的json库,百度了下,竟然没有什么有用的资料,真的很残废。。。
谷歌下,发现了一个libjson,尝试了几小时,发现他弄得真复杂,很难懂API,再找。。。
又找到了一个叫mjson的,结果也没找到很权威的网站和介绍。。。继续
被引导到了json的官网,发现了宝贝啊。。。http://www.json.org/
C用来解析json的库竟然有那么多!!
随便点开几个看看,,最开始尝试的是microjson,下载后发现文件名就叫mjson.c/h,然后看了M’s JSON parser,发现他好像也叫mjson。。。醉了!!
不管那么多了,先玩玩microjson,几个小时的尝试和学习他们的例子,发现作者真的很懒,不写注释,连帮助信息也没有,有测试程序却不知道怎么入手。。。好不容入手了,结果发现虽然能实现我要的功能,却很难用!
再看看nxjson。。。很简单,很实用!!!
就他了。。。
下面就是官方的readme,介绍的很精简,但是却很实用!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
## Usage Example JSON code: { "some-int": 195, "array": [ 3, 5.1, -7, "nine", /*11*/ ], "some-bool": true, "some-dbl": -1e-4, "some-null": null, "hello": "world!", //"other": "/OTHER/", "obj": {"KEY": "VAL"} } C API: const nx_json* json=nx_json_parse(code, 0); if (json) { printf("some-int=%ld\n", nx_json_get(json, "some-int")->int_value); printf("some-dbl=%lf\n", nx_json_get(json, "some-dbl")->dbl_value); printf("some-bool=%s\n", nx_json_get(json, "some-bool")->int_value? "true":"false"); printf("some-null=%s\n", nx_json_get(json, "some-null")->text_value); printf("hello=%s\n", nx_json_get(json, "hello")->text_value); printf("other=%s\n", nx_json_get(json, "other")->text_value); printf("KEY=%s\n", nx_json_get(nx_json_get(json, "obj"), "KEY")->text_value); const nx_json* arr=nx_json_get(json, "array"); int i; for (i=0; i<arr->length; i++) { const nx_json* item=nx_json_item(arr, i); printf("arr[%d]=(%d) %ld %lf %s\n", i, (int)item->type, item->int_value, item->dbl_value, item->text_value); } nx_json_free(json); } |
移植上去,发现7681的sdk不支持errno.h,需要修改nxjson的源码,稍微改下就ok了!
下面放出来原始的源码和我修改后的源码,把nxjson.c放到cust目录,nxjson.h放到src/include/下即可!!
2016.03.25更新:
解决解析int值的问题,解决assert函数不支持的问题,解决strtoll不支持的问题,去除double类型的支持。
nxjson.c
nxjson.h
官方源码包