json-c项目实战

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。
用json做数据交换好处很多,用在web中便于服务端解析。当然在其他地方也经常出现,
比如下面介绍的是在C语言中的json库。json的基本语法网上一大堆,类似于下面这种形式。

  1. {

  2. "cmd": "SetPwd",

  3. "params": {

  4. "id": "test",

  5. "password": "test"

  6. }

  7. }

我们可以搜索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
  1. //假设mystr是机顶盒传过来的json字符串的地址

  2. //光猫这边接收数据和解析数据

  3. json_object *cmd = NULL;

  4. json_object *datobj=NULL;

  5. char *cmdval=NULL;

  6. pobj = json_tokener_parse(mystr);//实际项目中需要对解析结果进行判断

  7.  
  8. cmd =json_object_object_get(pobj,"cmd");

  9. cmdval=json_object_get_string(cmd);//获取到字符串"SetPwd"

  10.  
  11. datobj = json_object_object_get(pobj,"params");

  12. //根据命令cmdval找到对应的接口,然后在接口中解析

  13. char id[32] = {0};//用于保存账号的值

  14. char pwd[32] = {0};//用于保存密码的值

  15. json_object *new_obj = NULL;

  16. char *pstr =NULL;

  17. new_obj = json_object_object_get(datobj,"id");

  18. pstr= json_object_get_string(new_obj);//转化为字符串

  19. strcpy(id,pstr); //把账号存放到字符数组id中。

  20. new_obj = json_object_object_get(datobj,"password");

  21. pstr= json_object_get_string(new_obj);//转化为字符串

  22. strcpy(pwd,pstr);//把密码存放到数组pwd中

  23. //......

  24. //这里省略的步骤是:光猫会做处理,向把机顶盒传进来的参数设置到光猫中

  25. //设置成功之后再把账号和密码以json的数据格式返回给机顶盒

  26.  
  27. //创建一个json对象newPobj

  28. json_object *newPobj = NULL;

  29. newPobj = json_object_new_object();

  30. char *result = "OK";

  31. //往newPobj里面添加键值对

  32. json_object_object_add(pobj,"result",json_object_new_string(result));

  33. //创建一个json对象paramsProbj

  34. json_object *paramsProbj = NULL;

  35. paramsProbj = json_object_new_object();

  36. //往paramsProbj里面添加键值对

  37. json_object_object_add(paramsProbj,"id",json_object_new_string(id));

  38. json_object_object_add(paramsProbj,"password",json_object_new_string(pwd));

  39. //把paramsProbj添加到newPobj对象中

  40. json_object_object_add(newPobj,"paramsProbj",paramsProbj);

  41. //释放内存

  42. json_object_put(pobj);

  43. 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

猜你喜欢

转载自blog.csdn.net/qq_19004627/article/details/88218811
今日推荐