JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。
用json做数据交换好处很多,用在web中便于服务端解析。当然在其他地方也经常出现,
比如下面介绍的是在C语言中的json库。json的基本语法网上一大堆,类似于下面这种形式。
-
{
-
"cmd": "SetPwd",
-
"params": {
-
"id": "test",
-
"password": "test"
-
}
-
}
我们可以搜索json在线校验来查看自己写的json数据是否正确。
我们用库,知道怎么查看库函数是必须的。附:json-c库函数查询
项目中使用json-c的背景:
项目中遇到在两个不同的机器中进行通信,通信的方式采用tcp协议,用的是socket编程。
光猫作为TCP服务器端使用,机顶盒作为TCP客户端使用。
机顶盒需要调用光猫的接口。光猫获取底层接口的信息最后返回给机顶盒。
这时候,可以约定特定简单的字符串,但最后还是采用JSON 作为数据交换格式。理由如下:
1、方便于传输,较少冗余的字符。
2、JSON支持多种语言
3、方便转换,有成熟的json库
4、阅读结构很清晰。
下面进行实际代码分析:
程序可以分为三个步骤:
1、机顶盒向光猫传来json数据, 数据为:
{"cmd": "SetPwd","params": {"id": "test","password": "test"}}
- 1
2、光猫接收到数据,解析数据,然后设置进光猫中
3、设置成功之后,光猫获取账号和密码,再以json的数据格式返回给机顶盒,数据为:
{"result": "OK","params": {"id": "test","password": "test"}}
- 1
-
//假设mystr是机顶盒传过来的json字符串的地址
-
//光猫这边接收数据和解析数据
-
json_object *cmd = NULL;
-
json_object *datobj=NULL;
-
char *cmdval=NULL;
-
pobj = json_tokener_parse(mystr);//实际项目中需要对解析结果进行判断
-
cmd =json_object_object_get(pobj,"cmd");
-
cmdval=json_object_get_string(cmd);//获取到字符串"SetPwd"
-
datobj = json_object_object_get(pobj,"params");
-
//根据命令cmdval找到对应的接口,然后在接口中解析
-
char id[32] = {0};//用于保存账号的值
-
char pwd[32] = {0};//用于保存密码的值
-
json_object *new_obj = NULL;
-
char *pstr =NULL;
-
new_obj = json_object_object_get(datobj,"id");
-
pstr= json_object_get_string(new_obj);//转化为字符串
-
strcpy(id,pstr); //把账号存放到字符数组id中。
-
new_obj = json_object_object_get(datobj,"password");
-
pstr= json_object_get_string(new_obj);//转化为字符串
-
strcpy(pwd,pstr);//把密码存放到数组pwd中
-
//......
-
//这里省略的步骤是:光猫会做处理,向把机顶盒传进来的参数设置到光猫中
-
//设置成功之后再把账号和密码以json的数据格式返回给机顶盒
-
//创建一个json对象newPobj
-
json_object *newPobj = NULL;
-
newPobj = json_object_new_object();
-
char *result = "OK";
-
//往newPobj里面添加键值对
-
json_object_object_add(pobj,"result",json_object_new_string(result));
-
//创建一个json对象paramsProbj
-
json_object *paramsProbj = NULL;
-
paramsProbj = json_object_new_object();
-
//往paramsProbj里面添加键值对
-
json_object_object_add(paramsProbj,"id",json_object_new_string(id));
-
json_object_object_add(paramsProbj,"password",json_object_new_string(pwd));
-
//把paramsProbj添加到newPobj对象中
-
json_object_object_add(newPobj,"paramsProbj",paramsProbj);
-
//释放内存
-
json_object_put(pobj);
-
json_object_put(new_obj);
需要注意的点:json object的内存释放
jsonc的内存管理方式, 是基于引用计数的内存树(链),只需要json_object_put释放顶层对象,其他子对象也就自动被释放。
函数int json_object_put (struct json_object * obj) 的机制是:obj的引用计数减1,当obj的引用计数为0时释放obj内存。如果json_object_put释放不用释放的json对象,或者没有释放该释放的json对象,都有可能会造成内存泄漏,造成程序的奔溃。
为了简洁代码,一些条件判断就没有写上去了,比如,libjson库对parse错误的判断方法是is_error()宏。
当然,本文介绍只是json-c的一小部分,但没关系,只要知道了基本方法,用到什么函数再去查就好了。
--------------------- 本文来自 云英 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u014530704/article/details/72674642?utm_source=copy