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的一小部分,但没关系,只要知道了基本方法,用到什么函数再去查就好了。
- json-c项目实战
- C json实战引擎 一 , 实现解析部分,json实战
- grails 193实战项目C
- C语言的一个项目实战
- C实战:项目构建Make,Automake,CMake
- C实战:项目构建Make,Automake,CMake
- 学C++,从企业项目实战开始。
- Java框架JSON-RPC项目demo代码实战
- Java框架JSON-RPC项目demo代码实战
- Java框架JSON-RPC项目demo代码实战
- 【SSH网上商城项目实战07】Struts2和Json的整合
- 【Gson】Json转换器之Gson——项目实战
- 【SSH网上商城项目实战07】Struts2和Json的整合
- web编程从入门到项目实战-Package.json篇
- 【SSH网上商城项目实战07】Struts2和Json的整合
- spring boot项目实战之工具篇(json)
- 项目实战
- 实战项目
- 1014. 福尔摩斯的约会 (20)
- Unity 3D 手机游戏开发学习随笔
- WebTours示例程序的订票流程-脚本
- LeetCode 150. Evaluate Reverse Polish Notation 辅助数据结构栈
- (91)调试面板
- json-c项目实战
- Devops学习实践(一) SVN安装和配置
- 《UNIX网络编程 卷1》 笔记: readline函数 (可重入版本)
- 【2014年第五届蓝桥杯C/C++程序设计本科B组决赛 信号匹配(代码填空) 】
- 明明的随机数
- PI监控Processed XML Messages
- LoadRunner测试webservice接口-方法一web_service_call()
- 提高页面性能的方法
- SqlMapConfig.xml批量配置别名