使用C语言的cJSON中给JSON字符串添加转义

在 cJSON 库中,没有直接提供 一个函数来专门给 JSON 字符串添加转义(如将 " 转义为 \"\n 转义为 \\n 等)。

但 cJSON 在 序列化(cJSON_Print 或 cJSON_PrintUnformatted 时会自动处理转义字符,确保生成的 JSON 字符串是合法的。


如何让 cJSON 处理转义?

1. 使用 cJSON_Print 或 cJSON_PrintUnformatted

当你将一个字符串(如 "Hello \"World\"\n")存入 cJSON_String 并使用 cJSON_Print 序列化时,cJSON 会自动添加转义:

#include "cJSON.h"
#include <stdio.h>int main() {cJSON *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "message", "Hello \"World\"\n"); // 字符串包含引号和换行符char *json_str = cJSON_Print(root); // 自动转义printf("%s\n", json_str);cJSON_Delete(root);free(json_str);return 0;
}

输出(自动转义后的合法 JSON):

{"message": "Hello \"World\"\n"
}

关键点:

  • cJSON_Print 和 cJSON_PrintUnformatted 在生成 JSON 字符串时,会自动转义:

    • " → \"

    • \ → \\

    • \n → \\n

    • \t → \\t

    • 其他控制字符也会被转义。


2. 手动转义(如果需要单独处理字符串)

如果 不经过 cJSON 序列化,而是想手动处理字符串的转义,可以自己实现一个函数,例如:

#include <string.h>
#include <stdlib.h>char *escape_json_string(const char *input) {const char *p = input;char *output = malloc(strlen(input) * 2 + 1); // 预留足够空间char *q = output;while (*p) {switch (*p) {case '\"': *q++ = '\\'; *q++ = '\"'; break;case '\\': *q++ = '\\'; *q++ = '\\'; break;case '\b': *q++ = '\\'; *q++ = 'b'; break;case '\f': *q++ = '\\'; *q++ = 'f'; break;case '\n': *q++ = '\\'; *q++ = 'n'; break;case '\r': *q++ = '\\'; *q++ = 'r'; break;case '\t': *q++ = '\\'; *q++ = 't'; break;default: *q++ = *p; break;}p++;}*q = '\0';return output;
}int main() {const char *str = "Hello \"World\"\n";char *escaped = escape_json_string(str);printf("Original: %s\n", str);printf("Escaped: %s\n", escaped);free(escaped);return 0;
}

输出:

Original: Hello "World"
Escaped: Hello \"World\"\n

总结

方法适用场景是否推荐
cJSON_Print / cJSON_PrintUnformatted自动在 JSON 序列化时转义✅ 推荐
手动转义函数单独处理字符串,不经过 cJSON 序列化⚠️ 需要自己管理内存

推荐做法:
✅ 直接使用 cJSON_Print,让 cJSON 在序列化时自动处理转义,避免手动管理转义逻辑。

如果你有特殊需求(如仅转义字符串而不生成完整 JSON),可以自己实现转义函数(参考上面的 escape_json_string)。

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

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

相关文章

宇树机器狗go2—slam建图(1)点云格式

0.前言 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动&#xff0c;本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式&#xff0c;在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…

第1期:Python基础语法入门

1.1 Python简介 Python是一种解释型、面向对象、动态数据类型的高级编程语言。它设计简洁&#xff0c;易于学习&#xff0c;适合初学者。Python广泛应用于数据科学、人工智能、Web开发、自动化脚本等领域。它的语法简洁易懂&#xff0c;强调代码的可读性。 1.2 安装Python与配…

使用EXCEL绘制平滑曲线

播主播主&#xff0c;你都多少天没更新了&#xff01;&#xff01;&#xff01;泥在干什么&#xff1f;你还做这个账号麻&#xff1f;&#xff01;&#xff01;&#xff01; 做的做的&#xff08;哭唧唧&#xff09;&#xff0c;就是最近有些忙&#xff0c;以及…… 前言&…

当算力遇上马拉松:一场科技与肉身的极限碰撞

目录 一、从"肉身苦修"到"科技修仙" 二、马拉松的"新大陆战争" 三、肉身会被算法"优化"吗? 马拉松的下一站是"人机共生"时代 当AI能预测你的马拉松成绩,算法能规划最佳补给方案,智能装备让训练效率翻倍——你还会用传…

MLLMs for TSAD ?

项目链接:Multimodal LLMs Advance Time Series Analysis 代码链接:https://github.com/mllm-ts/VisualTimeAnomaly 出处:ICLR 2025 一 文章动机 多模态 LLM (MLLM) 通过 “视觉” 方式处理时序的潜力仍未充分探索; 人类检测 “时序异常” 的自然方式:可视化、文本描…

开发基于python的商品推荐系统,前端框架和后端框架的选择比较

开发一个基于Python的商品推荐系统时&#xff0c;前端和后端框架的选择需要综合考虑项目需求、开发效率、团队熟悉度以及系统的可扩展性等因素。 以下是一些推荐的框架和建议&#xff1a; 后端框架 Flask 优点&#xff1a; 轻量级&#xff1a;Flask的核心非常简洁&#xff0c;…

chili3d调试笔记2+添加web ui按钮

onclick 查找 打个断点看看 挺可疑的&#xff0c;打个断点看看 挺可疑的&#xff0c;打个断点看看 打到事件监听上了 加ui了 加入成功 新建弹窗-------------------------------------- 可以模仿这个文件&#xff0c;写弹窗 然后在这里注册一下&#xff0c;外部就能调用了 对了…

【重学Android】1.关于@Composer注解的一点知识笔记

最新因为一些原因&#xff0c;开始重新学习Android及kotlin编程&#xff0c;也觉得可以顺带记录下这个过程中的一些知识点&#xff0c;也可以用作日后自己查找复习。 Composable 注解在 Android 开发中的使用 Composable 是 Jetpack Compose&#xff08;Android 的现代声明式…

qt+mingw64+cmake+libqrencode项目编译和搭建成功记录

最近要使用高拍仪拍照获取照片&#xff0c;然后识别照片中的二维码数据、使用QZxing只能识别出一个条码、另外一个条码准备测试用其他的开源项目&#xff08;如libqrencode-4.1.1&#xff09;来进行测试&#xff0c;故进行本文的项目环境搭建测试&#xff0c;最后成功。 本机开…

【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 判断是不是平衡二叉树(递归)最大子矩阵(二维前缀和)小葱的01串(滑动窗口) 判断是不是平衡二叉树(递归) 判断是不是平衡二叉…

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…

定制一款国密浏览器(10):移植SM2算法前,解决错误码的定义问题

上一章中,我给大家介绍了 SM4 在 BoringSSL 上的移植要点,本来计划本章介绍 SM2 算法的移植要点。在移植 SM2 过程中,遇到了一个拦路虎,所以先扫除这个拦路虎,这就是错误码的定义问题。 在铜锁中,引入了几个错误码和错误字符串,在文件 sm2_err.c 中: static const ER…

JDOM处理XML:Java程序员的“乐高积木2.0版“

各位代码建筑师们&#xff01;今天我们要玩一款比原生DOM更"Java友好"的XML积木套装——JDOM&#xff01;它像乐高得宝系列&#xff08;Duplo&#xff09;一样简单易用&#xff0c;却能让你的XML工程稳如霍格沃茨城堡&#xff01;&#xff08;温馨提示&#xff1a;别…

【后端开发】Spring日志

文章目录 Spring日志日志作用日志测试日志信息日志级别日志配置配置日志级别日志持久化日志文件分割 注解的使用 Spring日志 日志作用 系统监控&#xff1a;可以通过日志记录这个系统的运行状态&#xff0c;对数据进行分析&#xff0c;设置不同的规则&#xff0c;超过阈值时进…

探索大语言模型(LLM):Transformer 与 BERT从原理到实践

Transformer 与 BERT&#xff1a;从原理到实践 前言一、背景介绍二、核心公式推导1. 注意力机制&#xff08;Attention Mechanism&#xff09;2. 多头注意力机制&#xff08;Multi-Head Attention&#xff09;3. Transformer 编码器&#xff08;Transformer Encoder&#xff09…

计算机网络八股——HTTP协议与HTTPS协议

目录 HTTP1.1简述与特性 1. 报文清晰易读 2. 灵活和易于扩展 3. ⽆状态 Cookie和Session 4. 明⽂传输、不安全 HTTP协议发展过程 HTTP/1.1的不足 HTTP/2.0 HTTP/3.0 HTTPS协议 HTTP协议和HTTPS协议的区别 HTTPS中的加密方式 HTTPS中建立连接的方式 前言&#xff…

QML中的3D功能--入门开发

Qt Quick 提供了强大的 3D 功能支持,主要通过 Qt 3D 模块实现。以下是 QML 中开发 3D 应用的全面指南。 1. 基本配置 环境要求 Qt 5.10 或更高版本(推荐 Qt 6.x) 启用 Qt 3D 模块 支持 OpenGL 的硬件 项目配置 在 .pro 文件中添加: QT += 3dcore 3drender 3dinput 3dex…

Git合并分支的两种常用方式`git merge`和`git cherry-pick`

Git合并分支的两种常用方式git merge和git cherry-pick 写在前面1. git merge用途工作方式使用git命令方式合并使用idea工具方式合并 2. git cherry-pick用途工作方式使用git命令方式合并使用idea工具方式合并 3. 区别总结 写在前面 一般我们使用git合并分支常用的就是git mer…

Web三漏洞学习(其三:rce漏洞)

靶场&#xff1a;NSSCTF 三、RCE漏洞 1、概述 在Web应用开发中会让应用调用代码执行函数或系统命令执行函数处理&#xff0c;若应用对用户的输入过滤不严&#xff0c;容易产生远程代码执行漏洞或系统命令执行漏洞 所以常见的RCE漏洞函数又分为代码执行函数和系统命令执行函数…