当前位置: 首页 > news >正文

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.dtcms.com/a/350504.html

相关文章:

  • 【什么是端到端模型】
  • 益莱储@PCIe技术大会
  • Bright Data 代理 + MCP :解决 Google 搜索反爬的完整方案
  • WPF 参数设置界面按模型字段自动生成设置界面
  • Docker:网络连接
  • python面试题目100个(更新中预计10天更完)
  • 深度学习(二):数据集定义、PyTorch 数据集定义与使用(分板块解析)
  • 决策树原理与 Sklearn 实战
  • 【动手学深度学习】7.1. 深度卷积神经网络(AlexNet)
  • 0825 http梳理作业
  • 【慕伏白】CTFHub 技能树学习笔记 -- Web 之信息泄露
  • Linux多线程[生产者消费者模型]
  • python项目中pyproject.toml是做什么用的
  • 【Canvas与标牌】维兰德汤谷公司logo
  • Hadoop MapReduce Task 设计源码分析
  • java-代码随想录第十七天| 700.二叉搜索树中的搜索、617.合并二叉树、98.验证二叉搜索树
  • C++ STL 专家容器:关联式、哈希与适配器
  • 《微服务架构下API网关流量控制Bug复盘:从熔断失效到全链路防护》
  • 精准测试的密码:解密等价类划分,让Bug无处可逃
  • 【C语言16天强化训练】从基础入门到进阶:Day 11
  • 朴素贝叶斯算法总结
  • 互联网大厂Java面试实录:Spring Boot与微服务架构解析
  • cmd命令行删除文件夹
  • rk3566编译squashfs报错解决
  • QT5封装的日志记录函数
  • 算法练习-遍历对角线
  • 开源夜莺里如何引用标签和注解变量
  • VTK开发笔记(四):示例Cone,创建圆锥体,在Qt窗口中详解复现对应的Demo
  • 使用Cloudflare的AI Gateway代理Google AI Studio
  • 论文阅读:Code as Policies: Language Model Programs for Embodied Control