cJSON 修改已有的键值对

news/2025/2/26 21:03:32/文章来源:https://www.cnblogs.com/FBsharl/p/18739645

在 cJSON 中,修改已有的键值对可以通过以下步骤实现:

  1. 找到需要修改的键值对。

  2. 根据值的类型(字符串、数字、布尔值等),使用相应的函数更新值。

以下是具体的实现方法和示例代码:


1. 修改字符串类型的值

使用 cJSON_ReplaceItemInObject 或直接修改 valuestring

示例代码:

c
复制
#include "cJSON.h"
#include <stdio.h>void modify_json_string(cJSON* root, const char* key, const char* new_value) {cJSON* item = cJSON_GetObjectItem(root, key);if (item != NULL && cJSON_IsString(item)) {cJSON_SetValuestring(item, new_value);  // 直接修改字符串值} else {printf("Key not found or not a string!\n");}
}int main(void) {const char* json_string = "{\"name\":\"Alice\",\"age\":25}";cJSON* root = cJSON_Parse(json_string);if (root == NULL) {printf("JSON parse error!\n");return 1;}modify_json_string(root, "name", "Bob");char* modified_json = cJSON_Print(root);printf("Modified JSON: %s\n", modified_json);cJSON_Delete(root);cJSON_free(modified_json);return 0;
}

2. 修改数字类型的值

直接修改 valueint 或 valuedouble

示例代码:

c
复制
#include "cJSON.h"
#include <stdio.h>void modify_json_number(cJSON* root, const char* key, int new_value) {cJSON* item = cJSON_GetObjectItem(root, key);if (item != NULL && cJSON_IsNumber(item)) {item->valueint = new_value;  // 修改整数值item->valuedouble = (double)new_value;  // 同时修改双精度值} else {printf("Key not found or not a number!\n");}
}int main(void) {const char* json_string = "{\"name\":\"Alice\",\"age\":25}";cJSON* root = cJSON_Parse(json_string);if (root == NULL) {printf("JSON parse error!\n");return 1;}modify_json_number(root, "age", 30);char* modified_json = cJSON_Print(root);printf("Modified JSON: %s\n", modified_json);cJSON_Delete(root);cJSON_free(modified_json);return 0;
}

3. 修改布尔类型的值

直接修改 valueint

示例代码:

c
复制
#include "cJSON.h"
#include <stdio.h>void modify_json_bool(cJSON* root, const char* key, int new_value) {cJSON* item = cJSON_GetObjectItem(root, key);if (item != NULL && cJSON_IsBool(item)) {item->valueint = new_value;  // 修改布尔值} else {printf("Key not found or not a boolean!\n");}
}int main(void) {const char* json_string = "{\"name\":\"Alice\",\"is_student\":true}";cJSON* root = cJSON_Parse(json_string);if (root == NULL) {printf("JSON parse error!\n");return 1;}modify_json_bool(root, "is_student", 0);  // 修改为 falsechar* modified_json = cJSON_Print(root);printf("Modified JSON: %s\n", modified_json);cJSON_Delete(root);cJSON_free(modified_json);return 0;
}

4. 修改嵌套的键值对

如果 JSON 数据是嵌套的,需要先找到嵌套的对象,然后再修改键值对。

示例代码:

c
复制
#include "cJSON.h"
#include <stdio.h>void modify_nested_json(cJSON* root, const char* parent_key, const char* key, const char* new_value) {cJSON* parent = cJSON_GetObjectItem(root, parent_key);if (parent != NULL && cJSON_IsObject(parent)) {cJSON* item = cJSON_GetObjectItem(parent, key);if (item != NULL && cJSON_IsString(item)) {cJSON_SetValuestring(item, new_value);  // 修改嵌套的字符串值} else {printf("Key not found or not a string!\n");}} else {printf("Parent key not found or not an object!\n");}
}int main(void) {const char* json_string = "{\"name\":\"Alice\",\"address\":{\"city\":\"New York\"}}";cJSON* root = cJSON_Parse(json_string);if (root == NULL) {printf("JSON parse error!\n");return 1;}modify_nested_json(root, "address", "city", "Los Angeles");char* modified_json = cJSON_Print(root);printf("Modified JSON: %s\n", modified_json);cJSON_Delete(root);cJSON_free(modified_json);return 0;
}

5. 替换整个键值对

如果需要替换整个键值对(包括键和值),可以使用 cJSON_ReplaceItemInObject

示例代码:

c
复制
#include "cJSON.h"
#include <stdio.h>void replace_json_item(cJSON* root, const char* key, cJSON* new_item) {cJSON_ReplaceItemInObject(root, key, new_item);
}int main(void) {const char* json_string = "{\"name\":\"Alice\",\"age\":25}";cJSON* root = cJSON_Parse(json_string);if (root == NULL) {printf("JSON parse error!\n");return 1;}cJSON* new_item = cJSON_CreateString("Bob");replace_json_item(root, "name", new_item);char* modified_json = cJSON_Print(root);printf("Modified JSON: %s\n", modified_json);cJSON_Delete(root);cJSON_free(modified_json);return 0;
}

6. 注意事项

  • 内存管理:如果使用 cJSON_ReplaceItemInObject,旧的值会被自动释放,无需手动调用 cJSON_Delete

  • 类型检查:在修改值之前,务必检查值的类型(如 cJSON_IsStringcJSON_IsNumber 等),避免类型不匹配导致的错误。

  • 嵌套对象:修改嵌套对象时,需要先找到父对象,然后再修改子对象。


总结

通过以上方法,可以轻松修改 cJSON 中的键值对。根据值的类型(字符串、数字、布尔值等),选择合适的方式进行修改。如果需要替换整个键值对,可以使用 cJSON_ReplaceItemInObject。如果有更多问题,欢迎继续讨论!

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

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

相关文章

Redis概述安装与基本数据类型

Redis概述安装与基本数据类型 1. 什么是NoSQL NoSQL( Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. NoSQL的广泛应用 随着大数据的兴起,数据量的暴增,数据类型的丰富,传统的关系数据库在应付动…

Hello! I am Zhan Yijue,nice to meet you

这个作业属于哪个课程 23软件工程这个作业要求在哪里 【作业1】自我介绍+软工5问这个作业的目标 学习使用 Markdown, 熟练掌握 GitHub 及 Git 的使用方法, 建立个人博客个人介绍 ❤️ 兴趣爱好听歌 🎧 书法📝 看书,尤其是科幻小说 📊 二次元爱好者 🎩📖 学习经历广东…

Hugging Face 发布 Python WebRTC 库:构建实时音视频应用;微软 Magma:多模态跨数字物理世界丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

1Panel 专业版评测:全面超越宝塔的运维面板新标杆

一、 UX体验与移动端适配:更直观的跨平台交互 1Panel 专业版在用户体验上实现了对宝塔的全面超越。其界面采用现代化设计语言,以黑金主题 为代表的可定制化主题系统支持一键切换,视觉风格更符合技术审美,同时保持功能模块的清晰布局。相较于宝塔复杂的多级菜单,1Panel 的 …

基于抖音agent平台Cozi打造Agent智能体

AI Agent 一、AI Agent(智能体)与开发平台 【1】AI Agent的概念 AI Agent直接翻译更准确,AI代理人。AI Agent是指可以自主执行任务或目标的系统,它可以是一个软件,也可以是一个智能机器,这些系统通过感知环境并在此基础上做出决策。AI Agent可以集成多种技术,包括AI大模…

纯离线部署本地知识库LLM大模型

纯离线部署本地知识库LLM大模型 一、下载离线大模型下载的网址:https://hf-mirror.com/deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下载llama相关模型,同样是GGUF后缀的,自己笔记本电脑推荐下载8B的 二、下载大模型管理平台 LM Studio下载网址:https…

mailto链接

本文主要内容转载自Haorooms!好用的mailto网站话不多说直接上正菜! 大佬dawsbot提供的工具mailto.vercel.app前言 今天看到老外写的一篇关于mailto: HTML e-mail 的文章,感觉很新奇,以前从来没有这么用过,用email的时候,最多用过mailto,但是其中穿链接参数,还是第一次看…

二次开发(第一周作业)

(1) 来源 C++ 大作业 超市收银系统 - shugen - 博客园 该文章介绍了一个软件的实现过程,并提供了相关代码。通过对该软件的分析对其进行了改进和二次开发。 (2) 运行环境+运行结果的截图(伸缩代码附上) 操作系统:Windows 11 开发工具:Dev-c++ 编程语言:C++ 运行结果截…

iconfont本地引入

本地引入iconfont的好处 Butterfly主题自带的Font Awesome图标库免费版里有好多图标没有,而阿里巴巴的开源图标iconfont里的图标非常丰富,所以可以同时引入一下iconfont图标作为Font Awesome图标库的补充。 考虑到在线引入的icon图标大小都是16x16的,而Font Awesome图标一般…

powershell-alias配置方案

最近实在被git命令和poetry命令搞烦了,每次都要输入好长的命令,并且都差不太多,所以就搜索了怎么配置alias,下面是我的配置过程,主要资料来自[1]。配置 因为我用的是Windows Terminal,主要使用的Powershell环境,所以一下教程主要是以Powershell为例,配置的Alias主要是关…

leetcode hot 13

解题思路:本题思路主要是前缀和思想,涉及到子集和问题,前缀和思想有效,两个前缀和的差就等于对应一个子集和。本题可以用哈希表的方式记录每个前缀和的值,核心依靠k = pre[j]-pre[i]转化成pre[j]-k=pre[i],计算pre[i]这个值出现的个数加到res中,最后返回。 class Solutio…

redis - [10] 持久化

redis是一个内存数据库,断电即失。需要持久化到磁盘中。 001 || RDB 在执行的时间间隔内将内存中的数据集快照写入到磁盘(快照),恢复时是将快照文件直接读到内存中。 Redis会单独创建(fork)一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了…