json-c项目实战

来源:互联网 发布:usb编程器 编辑:程序博客网 时间:2024/06/14 17:52

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"}}

2、光猫接收到数据,解析数据,然后设置进光猫中
3、设置成功之后,光猫获取账号和密码,再以json的数据格式返回给机顶盒,数据为:

{"result": "OK","params": {"id": "test","password": "test"}}
    //假设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的一小部分,但没关系,只要知道了基本方法,用到什么函数再去查就好了。