赞
踩
推荐以下两篇,写的很好很详细,感谢!!!
C语言使用json-c发送网络数据_c语言发送json数据-CSDN博客
Linux-C C语言使用cJSON开源库解析JSON数据_linux cjson-CSDN博客()
在做C的项目时,对方通过TCP套接字将内容按照帧头+帧体的格式发送过来,其中帧体的内容是JSON格式的数据,就需要用C语言解析这部分数据,在此记录一下当时的学习过程。
GitHub - JHiroGuo/cJson: 基于C语言 跨平台json解析
cJson不做详细介绍了,就是C环境下的处理JSON数据一个工具库,具体库函数介绍,可以查看其中的头文件。
- {
- "status": 1,
- "data": [{
- "city": "上海",
- "temp": {
- "high": 22.2,
- "low": 10.1
- }
- }, {
- "city": "海南",
- "temp": {
- "high": 30,
- "low": 20.1
- }
- }]
- }

- /*
- jsbuf:待解析的json格式的字符串
- */
- void jsonParse(const char *jsbuf)
- {
- cJSON* city_value = NULL;
- cJSON* temp_value = NULL;
- cJSON* high_value = NULL;
- cJSON* low_value = NULL;
-
- if (jsbuf == NULL )
- return;
-
- cJSON* root = NULL;
- root = cJSON_Parse(jsbuf); //将字符串转成JSON数据
- if (root == NULL)
- {
- /* 字符串数据不符合json格式,打印出错误的字符串 */
- const char* err_ptr = cJSON_GetErrorPtr();
- printf("%s\r\n", err_ptr);
- return;
- }
- /* 解析常规对象 */
- cJSON* value = cJSON_GetObjectItem(root,"status");
- if (value == NULL)
- {
- cJSON_Delete(root); //删除根节点,释放内存
- }
-
- /* 解析数组对象 */
- value = cJSON_GetObjectItem(root,"data");
- /* 获取数组长度 */
- uint8_t len = cJSON_GetArraySize(value);
- for (int i = 0; i < len; i++)
- {
- /* 根据下标获取对象 */
- city_value = cJSON_GetArrayItem(value,i);
- temp_value = cJSON_GetArrayItem(value,i);
- if (temp_value == NULL)
- {
- return;
- }
- city_value = cJSON_GetObjectItem(city_value,"city");
- /* 读取JSON对象嵌套数据temp */
- temp_value = cJSON_GetObjectItem(temp_value, "temp");
- high_value = cJSON_GetObjectItem(temp_value,"high");
- low_value = cJSON_GetObjectItem(temp_value,"low");
- printf("city:%s\r\n", cJSON_Print(city_value)); /* 把数据转成 字符串输出 */
- printf("%s\r\n%s\r\n", cJSON_GetStringValue(high_value), cJSON_GetStringValue(low_value)); /* 获取对应键值,用于打印 */
- }
-
- cJSON_Delete(root);
- }

(3)运行结果
- city:"上海"
- 22.2
- 10.1
- city:"海南"
- 30.1
- 20.1
推荐一个JSON格式校验的网站: 在线JSON校验格式化工具(Be JSON)
C++也有这样的三方库,等后续测试了在补充。测试用的JSON格式数据,我用的都是字符串拼接。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。