C-JSON接口的使用

一、cJSON 核心数据结构

cJSON 的所有操作都围绕 cJSON 结构体展开,它代表 JSON 中的一个节点(可以是对象、数组、字符串、数字等):

typedef struct cJSON 
{struct cJSON *next, *prev;  // 用于链表(数组/对象的子节点)struct cJSON *child;        // 子节点(对象/数组的元素)int type;                   // 节点类型(见下方宏定义)char *valuestring;          // 字符串值(type为字符串时有效)int valueint;               // 整数值(type为数字时可用)double valuedouble;         // 浮点值(type为数字时有效)char *string;               // 键名(对象的键)
} cJSON;

节点类型宏定义(部分常用):

  • cJSON_False:布尔值 false
  • cJSON_True:布尔值 true
  • cJSON_NULL:null
  • cJSON_Number:数字(整数 / 浮点数)
  • cJSON_String:字符串
  • cJSON_Array:数组
  • cJSON_Object:对象

二、解析 JSON 字符串(核心接口)

1. 解析整个 JSON 字符串
cJSON *cJSON_Parse(const char *value);
  • 功能:将 JSON 字符串解析为 cJSON 结构体(根节点)。
  • 参数:value 为 JSON 格式的字符串。
  • 返回:成功返回根节点指针,失败返回 NULL
2. 获取节点类型
int cJSON_GetType(const cJSON *item);
3. 从对象中获取子节点(按键名)
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
  • 功能:从 JSON 对象中根据键名获取子节点。
  • 参数:object 为对象节点,string 为键名。
  • 返回:找到的子节点指针,未找到返回 NULL
4. 获取数组长度
int cJSON_GetArraySize(const cJSON *array);

功能:获取 JSON 数组的元素个数

5. 从数组中获取元素(按索引)
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
  • 功能:从数组中根据索引获取元素。
  • 参数:array 为数组节点,index 为索引(从 0 开始)。
6. 释放解析后的 cJSON 结构
void cJSON_Delete(cJSON *c);
  • 功能:释放整个 cJSON 链表(根节点及所有子节点),防止内存泄漏。

三、构建 JSON 字符串(核心接口)

1. 创建基础类型节点
cJSON *cJSON_CreateNumber(double num);       // 创建数字节点
cJSON *cJSON_CreateString(const char *string); // 创建字符串节点
cJSON *cJSON_CreateBool(cJSON_bool boolean);   // 创建布尔节点
cJSON *cJSON_CreateNull(void);                // 创建 null 节点
2. 创建数组和对象
cJSON *cJSON_CreateArray(void);  // 创建空数组
cJSON *cJSON_CreateObject(void); // 创建空对象
3. 向数组添加元素
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
  • 功能:将节点添加到数组末尾。
4. 向对象添加键值对
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
  • 功能:向对象添加键为 string、值为 item 的键值对。
5. 将 cJSON 结构转为字符串
char *cJSON_Print(const cJSON *item);         // 格式化输出(带缩进)
char *cJSON_PrintUnformatted(const cJSON *item); // 紧凑输出(无缩进)
  • 返回:动态分配的字符串,使用后需用 free() 释放。

6. 将 cJSON出错信息打印

printf("%s\n", ,cJSON_GetErrorPtr());

四、示例代码:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"  // 需包含 cJSON 头文件// 解析 JSON 示例
void parse_json_example(const char *json_str) 
{// 1. 解析 JSON 字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {printf("解析 JSON 失败: %s\n", cJSON_GetErrorPtr());return;}// 2. 获取 "success" 字段(字符串)cJSON *success = cJSON_GetObjectItem(root, "success");if (success && success->type == cJSON_String) {printf("请求状态: %s\n", success->valuestring);}// 3. 获取 "result" 对象cJSON *result = cJSON_GetObjectItem(root, "result");if (result && result->type == cJSON_Object) {// 4. 从 result 中获取城市和温度cJSON *city = cJSON_GetObjectItem(result, "city");cJSON *temp = cJSON_GetObjectItem(result, "temp");if (city && city->type == cJSON_String) {printf("城市: %s\n", city->valuestring);}if (temp && temp->type == cJSON_String) {printf("温度: %s℃\n", temp->valuestring);}// 5. 解析 "index" 数组cJSON *index_array = cJSON_GetObjectItem(result, "index");if (index_array && index_array->type == cJSON_Array) {int size = cJSON_GetArraySize(index_array);printf("生活指数(共 %d 条):\n", size);for (int i = 0; i < size; i++) {cJSON *item = cJSON_GetArrayItem(index_array, i);if (item && item->type == cJSON_String) {printf("  - %s\n", item->valuestring);}}}}// 6. 释放资源cJSON_Delete(root);
}// 构建 JSON 示例
void create_json_example() 
{// 1. 创建根对象cJSON *root = cJSON_CreateObject();if (root == NULL) {printf("创建根对象失败\n");return;}// 2. 向根对象添加字段cJSON_AddItemToObject(root, "name", cJSON_CreateString("天气查询"));cJSON_AddItemToObject(root, "version", cJSON_CreateNumber(1.0));cJSON_AddItemToObject(root, "enabled", cJSON_CreateBool(1));  // true// 3. 创建数组并添加元素cJSON *cities = cJSON_CreateArray();cJSON_AddItemToArray(cities, cJSON_CreateString("北京"));cJSON_AddItemToArray(cities, cJSON_CreateString("上海"));cJSON_AddItemToObject(root, "support_cities", cities);// 4. 转为字符串并打印char *json_str = cJSON_Print(root);  // 格式化输出if (json_str) {printf("\n构建的 JSON:\n%s\n", json_str);free(json_str);  // 释放字符串}// 5. 释放资源cJSON_Delete(root);
}int main() 
{// 模拟 API 返回的 JSON 字符串const char *api_response = "{""\"success\":\"1\",""\"result\":{""\"city\":\"北京\",""\"temp\":\"25\",""\"weather\":\"晴\",""\"index\":[\"适宜出行\",\"注意防晒\"]""}""}";// 解析示例parse_json_example(api_response);// 构建示例create_json_example();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94584.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript 类型系统(二)

本文将简述类型系统中的类型联合&#xff0c;通俗的来说就是将一个变量规定为不是某一个类型&#xff0c;而是某些类型&#xff0c;我们在日常开发中很常见下面会给出例子。值类型在JavaScript中用const声明的变量是不可以再次赋值的&#xff0c;也就是常量。在TypeScript中也可…

无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC08,速度闭环控制(有电流环)

导言 《STM32F405CubeMXHAL库SimpleFOC07&#xff0c;ADC采样相电流&#xff0c;频率20KHz&#xff08;TIM1触发Injected Sampling中断》&#xff0c;有了上一章节的电流采样后&#xff0c;可以完善速度闭环控制了。 有了电流环的速度闭环控制&#xff0c;电机的扭矩会显得大很…

【机械故障】共振峰

机械故障信号分析 提示:学习笔记 1、机械振动名词 2、共振峰 共振峰 机械故障信号分析 1、机械振动名词 [2、共振峰](https://editor.csdn.net/md/?not_checkout=1&activity_id=10937&spm=1057.2600.3001.10415) @[TOC](共振峰) `详细讲解共振峰、共振频率带、共振频…

力扣(用队列实现栈)

解析 LeetCode 225. 用队列实现栈&#xff1a;单队列的巧妙运用 一、题目分析&#xff08;一&#xff09;功能需求 实现 MyStack 类&#xff0c;支持栈的四种操作&#xff1a; push(int x)&#xff1a;将元素压入栈顶。pop()&#xff1a;移除并返回栈顶元素。top()&#xff1a;…

服务器Docker 安装和常用命令总结

Docker 安装和常用命令总结Docker 是一种开源平台&#xff0c;用于自动化应用程序的部署、扩展和管理。通过将应用程序及其依赖打包到一个轻量级、可移植的容器中&#xff0c;Docker 能够在任何地方统一运行&#xff0c;解决了不同环境间的兼容性问题。本篇文章将介绍 Docker 的…

2025年广东省无线电管理普法宣传活动

一、无线电发射设备型号核准相关制度及要求1.型号核准设备类型&#xff1a;一、公众网移动通信设备二、专用通信设备三、无线接入设备四、广播发射设备五、雷达设备六、导航设备七、卫星通信设备(含终端地球站)无线电发射设备八、公众网移动通信模块九、无线接入模块十、其他设…

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究 原文:Speech transcription from South Tyrolean Dialect to Standard German with Whisper 本研究展示了首个经过微调的Whisper模型,用于将南蒂罗尔方言语音自动翻译为标准德语文本。为了满足字幕和翻译方面尚未被…

Nexus管理maven仓库和jar包的配置和使用

登录nexus以后点击Settings-Repository-Repositories-Create repository 选择maven2(hosted)创建两个仓库一个是Release叫做monitor-releases&#xff1a;一个是Snapshot叫做monitor-snapshots&#xff1a;在创建一个maven2(group)叫做monitor将maven-central&#xff08;用于存…

疯狂星期四文案网第50天运营日记

网站运营第50天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今天流量减了一些&#xff0c;我发现我的疯狂星期四的词没有排名第一了&#xff0c;感觉应该是抽象文案这个导致的&#xff0c;因为我发了…

计算机视觉学习路线:从入门到进阶的完整指南

计算机视觉学习路线&#xff1a;从入门到进阶的完整指南 计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域最热门和最具前景的方向之一&#xff0c;它赋予机器“看”和“理解”图像与视频的能力。无论你是学生、工程师还是对AI感兴趣的爱好者&#xff0c…

移动应用抓包与调试实战 Charles工具在iOS和Android中的应用

随着移动互联网的发展&#xff0c;几乎所有应用都依赖API接口进行数据交互。无论是登录注册、支付功能&#xff0c;还是新闻资讯加载&#xff0c;背后都需要与服务器频繁通信。如何快速定位问题、验证数据传输、模拟弱网环境&#xff0c;成为移动端开发者日常工作中的关键任务。…

【Python NTLK自然语言处理库】

安装流程 import nltk nltk.download()运行后出现一个界面&#xff0c;然后按DownloadTokenize ###分词 from nltk.tokenize import word_tokenize text "The vendor paid $20,000,000." tokens word_tokenize(text) print(tokens)输出 [The, vendor, paid, $, 20,…

GitHub 热榜项目 - 日榜(2025-08-25)

GitHub 热榜项目 - 日榜(2025-08-25) 生成于&#xff1a;2025-08-25 统计摘要 共发现热门项目&#xff1a;20 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术趋势&#xff1a;1&#xff09;AI代理开发成主流&#xff0c;如moeru-ai/airi的虚拟伴…

Mac相册重复照片终结指南:技术流清理方案

你的Mac相册是否变成了"重复照片博物馆"&#xff1f;同一场景的多个版本、连续拍摄的相似图片、不同设备导入的重复文件...这些数字冗余正在悄无声息地吞噬着宝贵的存储空间。本文将为你提供一套完整的技术解决方案。重复照片问题的技术分析重复类型分类从技术角度&a…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(19):文法复习+单词第7回1

日语学习-日语知识点小记-构建基础-JLPT-N3阶段&#xff08;19&#xff09;&#xff1a;文法单词第7回&#xff11; 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰2、知识点&#xff11;ー 復習3、单词&#xff08;1&#xff09;日语单词  …

完美世界招数据仓库工程师咯

数据仓库工程师-偏BI方向 &#xff08;岗位信息经过jobleap.cn授权&#xff0c;可在CSDN发布&#xff09;完美世界 北京 职位描述 负责数据仓库架构设计、建模和ETL开发&#xff0c;构建可扩展的数据仓库和分析解决方案&#xff1b; 负责对数据仓库的性能和效率优化&#xff1…

RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设

【RabbitMQ面试精讲 Day 26】RabbitMQ监控体系建设 在“RabbitMQ面试精讲”系列的第26天&#xff0c;我们将聚焦于RabbitMQ监控体系建设这一关键运维主题。作为消息中间件的核心组件&#xff0c;RabbitMQ一旦出现消息积压、节点宕机或资源耗尽等问题&#xff0c;将直接影响系统…

把word按章节分为n份 一个文档拆分为多份格式不变

如果你有一个word文档&#xff0c;里面有很多章节&#xff0c;你想按照章节把它分为N份&#xff0c;每一份存放在一个独立的文档中&#xff0c;而且拆分之后的文档格式和图片都保持不变。那么你可以试一下这个工具。 #word拆分 #word按章节拆分 #word分为n份 #docx拆分章节 把w…

项目历程—缓存系统v1

实现目标1&#xff1a;输入key&#xff0c;value可以存储新建一个文件&#xff0c;并存储一个值 (√) 实现目标2&#xff1a;封装方法&#xff0c;循环创建1000个文件&#xff0c;分别存储一个值 (√) 实现目标3&#xff1a;通过输入一个key可以检测到文件里面的内容值 (√) 两…