【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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl