【C语言实用库】cJSON-解析json数据的利器

2024-09-05 21:18

本文主要是介绍【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数据的利器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140091

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现