JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于
JavaScript Programming Language ,
Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON基于两种结构:
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
- 1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值(俗称K-V对),所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
- 2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
本实验打包的json数据涵盖了这两种结构,加上对象的二级嵌套,在嵌入式领域,如此复杂程度的数据结构已满足需求。基于mico操作系统
实验操作流程:
软件平台:micoder SecureCRT
SDK:mico3.0.0
应用程序:json_C_Demo(附件中给出此文件)
硬件:micokit3165,stlink或者jlink
1、将json_C_Demo复制到mico3.0.0中demo文件下
2、编译下载
3、查看实验现象,如下:
可以看到,log上打印的是一个完整的json对象以及解析出来的一个个K-V对。
闲话不多说,直接上json打包实例:
var json = {
"text":"MXCHIP won a prize",
"id": 1234,
"detail":{
"comp": "MXCHIP.Inc",
"from":"ShangHai",
"focus":"Internet of Things",
"module":[{"k":"EMW3165"},{"k":"EMW3166"},{"k":"EMW3031"},{"k":"EMW3239"}]
}
};
此例中text和id为一级结构中的数据,detail为二级嵌套,且detail中module为数组,数组内同样是一个个K-V对。
OK,今天就以上述json包为例,向同学们讲解json数据包从创建到解析的全过程。
一、创建
1、定义big_object结构体存放整个json包:
struct json_object *
big_object=json_object_new_object();
2、往big_object中添加一级的K-V对:
json_object_object_add(big_object, "text", json_object_new_string("MXCHIP won a prize"));
3、定义detail_object存放二级嵌套的数据:
struct json_object *
detail_object = json_object_new_object();
4、往detail_object中添加K-V对:
json_object_object_add(detail_object, "comp", json_object_new_string("MXCHIP.Inc"));
5、创建数组存放module对应的value:
struct json_object *
myarray = json_object_new_array( );
6、分别创建四个json_object结构体存放数组内的K-V对,再依次添加到数组myarray中
struct json_object *
k=json_object_new_object();;
json_object_object_add(
k, "k", json_object_new_string("EMW3165"));
json_object_array_add(myarray,
k);
7、将myarray添加到detail_object中,再将detail_object添加到big_object中:
json_object_object_add(detail_object, "module", myarray);
json_object_object_add(big_object, "detail", detail_object);
至此,整个json数据包打包完成!
逻辑还是很简单的,可以将{"k":"value"}看成json数据包的基本格式,然后从基本K-V对组成module->detail_object->big_object。
8、将big_object对象转字符串,就可以打印出来了:
char *
string = json_object_to_json_string(big_object);
二、解析
1、先把字符串转成对象,定义一个parse_object接收
json_object *
parse_object= json_tokener_parse(
string);
2、把一级结构下的K-V对遍历解析出来
json_object_object_foreach(parse_object, key, val)
3、创建一个嵌套对象
temp_object,用来接收detail
json_object* temp_object=json_object_object_get(parse_object,"detail");
4、将detail下的前三个K-V对分别接收,调用的是: json_object_object_get。
再调用 json_object_to_json_string将对象转成字符串打印出来。
5、最后来处理detail下的module数组,首先定义一个数组用来接收module
json_object*
array= json_object_object_get(temp_object,"module");
然后在循坏内将module内的K-V对一个个接收出来
for(int i=0; i
struct json_object *
obj =json_object_array_get_idx(array, i);
struct json_object *
value_object=json_object_object_get(obj,"k");
os_json_log("k=%s",json_object_to_json_string(value_object));
}
至此,所有的json对象(即一个个最小K-V对)全部接收完毕,解析完成!从逻辑上看就是:
一级的两个K-V对------>二级嵌套下的三个K-V对------>二级嵌套下数组内的四个K-V对。
源码会以附件给出,同学们可以参照着上述逻辑,把源码看顺畅了。然后打包一个自己的json对象, 从创建到解析都做一遍打印出来,就完成了本次教程的所有内容。