【C语言实用库】cJSON-解析json数据的利器
cJSON是用于解析json格式字符串的一套api,非常好用,下面介绍一下使用方法:
1. json介绍
json中一般是"key":value的形式,而value有一共7种类型,下面是cJSON中对几种类型的宏定义:
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
本文也是将上面7种类型全部包括,分别介绍如何获取key对应的value值,以下是本文用到的json格式字符串,其中将数值分为整数和小数,另外添加了一个对象数组(参见朋友)
const char *str_xy = "{\\"姓名\":\"小一\",\\"年龄\":25,\\"身高\":175.6,\\"爱好\":[\"读书\",\"写字\",\"唱歌\"],\\"家人\": {\"哥哥\":\"小法\",\"姐姐\":\"潇潇\"},\\"朋友\": [{\"姓名\":\"小丽\",\\"是否同学\":true},\{\"姓名\":\"小风\",\\"是否同学\":false}],\\"修仙等级\":null\}";
2. json解析
2.1 将字符串解析为json格式数据
cJSON *json_str_xy = cJSON_Parse(str_xy);
// --判断是否可以解析为json
if(json_str_xy == NULL) {printf("字符串不是标准的json格式!\n");// --释放空间,见文章最后cJSON_Delete(json_str_xy);
}
2.2 解析字符串(姓名)
cJSON *json_name = cJSON_GetObjectItem(json_str_xy, "姓名");
if(json_name != NULL && json_name->type == cJSON_String) {printf("姓名 = %s\n", json_name->valuestring);
}
2.3 解析数值(年龄和身高)
cJSON *json_age = cJSON_GetObjectItem(json_str_xy, "年龄");
if(json_age != NULL && json_age->type == cJSON_Number) {printf("年龄 = %d\n", json_age->valueint);
}
cJSON *json_high = cJSON_GetObjectItem(json_str_xy, "身高");
if(json_high != NULL && json_age->type == cJSON_Number) {printf("身高 = %0.2f\n", json_high->valuedouble);
}
2.4 解析数组(爱好)
cJSON *cjson_hobby = cJSON_GetObjectItem(json_str_xy, "爱好");
cJSON *cjson_hobby_item = NULL;
if(cjson_hobby != NULL && cjson_hobby->type == cJSON_Array) {int hobby_num = cJSON_GetArraySize(cjson_hobby);printf("爱好 =");for (int i = 0; i < hobby_num; i++) {cjson_hobby_item = cJSON_GetArrayItem(cjson_hobby, i);if(cjson_hobby_item != NULL && cjson_hobby_item->type == cJSON_String) {printf(";%s", cjson_hobby_item->valuestring);}}printf("\n");
}
2.5 解析对象(家人)
cJSON *json_family = cJSON_GetObjectItem(json_str_xy, "家人");
if(json_family != NULL && json_family->type == cJSON_Object) {printf("家人 = ");cJSON *json_brother = cJSON_GetObjectItem(json_family, "哥哥");if(json_brother != NULL && json_brother->type == cJSON_String) {printf("哥哥是%s", json_brother->valuestring);}cJSON *json_sister = cJSON_GetObjectItem(json_family, "姐姐");if(json_sister != NULL && json_sister->type == cJSON_String) {printf(";姐姐是%s\n", json_sister->valuestring);}
}
2.6 解析数组中嵌套对象
cJSON *json_friends = cJSON_GetObjectItem(json_str_xy, "朋友");
cJSON *json_friends_item = NULL;
if(json_friends != NULL && json_friends->type == cJSON_Array) {int friends_num = cJSON_GetArraySize(json_friends);cJSON **friends_name = malloc(sizeof(cJSON *) * friends_num);cJSON **friends_type = malloc(sizeof(cJSON *) * friends_num);printf("朋友 =");for (int i = 0; i < friends_num; i++) {json_friends_item = cJSON_GetArrayItem(json_friends, i);if(json_friends_item != NULL && json_friends_item->type == cJSON_Object) {friends_name[i] = cJSON_GetObjectItem(json_friends_item, "姓名");if(friends_name[i] != NULL && friends_name[i]->type == cJSON_String) {printf(" %s", friends_name[i]->valuestring);}friends_type[i] = cJSON_GetObjectItem(json_friends_item, "是否同学");if(friends_type[i] != NULL) {if(friends_type[i]->type == cJSON_True) {printf("是同学;");}if(friends_type[i]->type == cJSON_False) {printf("不是同学;");}}}}free(friends_name);free(friends_type);
}
2.7 解析null(修仙)
if(json_xiuxian != NULL && json_xiuxian->type == cJSON_NULL) {printf("\n修仙 = 不如信仰马克思\n");
}
2.8 释放空间(很重要,不操作会造成内存泄漏)
cJSON_Delete(json_str_xy);
3. 创建json数据
json数据的创建也很重要,所以下面将创建文章开头定义的字符串所对应的json数据
3.1 创建对象
cJSON *json_str_xy = cJSON_CreateObject();
3.2 添加字符串对象
cJSON_AddStringToObject(json_str_xy, "姓名", "小一");
3.3 添加数值型对象
cJSON_AddNumberToObject(json_str_xy, "年龄", 25);
cJSON_AddNumberToObject(json_str_xy, "身高", 175.6);
3.4 添加数组对象
const char *hobby[3] = {"读书","写字","唱歌"};
cJSON *json_hobby = cJSON_CreateStringArray(hobby, 3);
cJSON_AddItemToObject(json_str_xy, "爱好", json_hobby);
3.5 添加子对象
cJSON *json_family = cJSON_CreateObject();
cJSON_AddStringToObject(json_family, "哥哥", "小法");
cJSON_AddStringToObject(json_family, "姐姐", "潇潇");
cJSON_AddItemToObject(json_str_xy, "家人", json_family);
3.6 添加对象数组
cJSON *json_friend_1 = cJSON_CreateObject();
cJSON_AddStringToObject(json_friend_1, "姓名", "小明");
cJSON_AddBoolToObject(json_friend_1, "是否同学", cJSON_True);
cJSON *json_friend_2 = cJSON_CreateObject();
cJSON_AddStringToObject(json_friend_2, "姓名", "小李");
cJSON_AddBoolToObject(json_friend_2, "是否同学", cJSON_False);
cJSON *json_friend_array = cJSON_CreateArray();
cJSON_AddItemToArray(json_friend_array, json_friend_1);
cJSON_AddItemToArray(json_friend_array, json_friend_2);cJSON_AddItemToObject(json_str_xy, "朋友", json_friend_array);
3.7 添加null对象
cJSON_AddNullToObject(json_str_xy, "修仙");
4. 结束语
以上就是json对象的解析与创建,你学废了么?
【C语言实用库】cJSON-解析json数据的利器相关推荐
- openresty cjson解析json数据
openresty cjson解析json数据 官网:https://github.com/mpx/lua-cjson 文档:https://kyne.com.au/~mark/software/lu ...
- C/C++程序开发: cJSON的使用(创建与解析JSON数据)
一.cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器:它只包含一个C文件和一个头文件,可以非常 ...
- Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
JSON介绍: JSON:JavaScript对象表示法 JSON是存储和交换文本信息的语法. 特点: JSON是轻量级的文本数据交换格式 JSON独立于语言和平台 JSON具有自我描述性,更易理解 ...
- wps解析json数据_一些非常实用的JSON 教程
以下内容来自W3school. JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 ...
- ASP.NET中使用JObject和JArray解析Json数据 (实用、赞)
原文出处:ASP.NET中使用JObject和JArray解析Json数据 - 谢友海 - 博客园 本章将和大家分享如何在ASP.NET中使用JObject和JArray解析Json数据.话不多说,下 ...
- 教你不编程快速解析 JSON 数据
JSON 是一种轻量级的,不受语言约束的数据存储格式,大部分编程语言都可以解析它,并且对编程人员也十分友好.我们在进行通讯/数据交互时,非常经常用到 JSON 格式. 但是,我们在进行数据存储的时候, ...
- 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据
一 JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON建构于两种结构:json是Javascript中的对象和数组中的对象, ...
- Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers
一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...
- Java解析JSON数据
Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...
- 利用cJSON解析JSON格式
目录 一.JSON格式 二.cJSON下载 三.cJSON常用函数接口 四.cJSON解析JSON案例 1.一层键值 2.多层键值(两次为例) 3.json数组解析 五.JSON添加数据 (与链表类似 ...
最新文章
- 0x03.基本算法 — 前缀和与差分
- win7 win10下80端口被System进程占用的解决方法
- 大学最后一个学期了,感觉没对头。。。
- VMware ESXi 6.7服务器设置开机自动启动虚拟机
- [博客之路]如何增加一个博客的PR值(一)
- 双十一最新预测:这个连续多年夺第一的省份2020会被超越吗?
- SpringCloud feign 的三种超时时间配置
- 总结PHP中DateTime的常用方法
- 网站中公用头部与尾部
- java按条件查询结果为空_mybatis中查询结果为空时不同返回类型对应返回值问题...
- Python3中遇到UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in ordinal not in range(128)
- redis-cli 命令总结
- Life is short, you need Python. ——Bruce Eckel
- 阿里巴巴集团数据库运维经验分享
- 大疆aeb连拍_大疆进军运动相机领域,发布OSMO?ACTION,对标GoPro
- 搭建个人论坛网站图文教程
- 等比数列求和推导及优化
- Postgresql学习03-C外部函数创建,及与Plsql自定义函数效率对比
- python读取grib2文件
- clr 面试_C# 常见面试问题汇总
热门文章
- Windows共享上网的详细设置
- 恋爱骗局泛滥,过亿单身女性成待宰羔羊!
- 在linux安装java过程_挑战Java在Linux上安装过程分享
- 梳理PSS和SSS的位置
- Vos作曲家的不完全介绍[枫叶飘零]
- CUDA、CUDNN在windows下的安装及配置
- 【设计模式】行为模式之Visitor访问者
- web1.0 和 web2.0 以及 web3.0的发展史
- vue/multi-word-component-names报错处理
- 《LaneAF:Robust Multi-Lane Detection with Affinity Fields》论文笔记