【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

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir