我有一个非常简单的程序,它输出简单的 JSON 字符串,我手动将它连接在一起并通过 std::cout 流输出(输出真的很简单),但我的字符串可能包含双引号、花括号和其他可能破坏 JSON 字符串的字符。所以我需要一个库(或更准确地说是一个函数)来根据 JSON 标准转义字符串,尽可能轻量级,仅此而已。
我发现了一些用于将整个对象编码为 JSON 的库,但考虑到我的程序是 900 行 cpp 文件,我不想依赖一个比我的程序大几倍的库来实现简单的东西这个。
原文由 ddinchev 发布,翻译遵循 CC BY-SA 4.0 许可协议
警告
无论您采用何种解决方案,请记住 JSON 标准要求您转义 _所有控制字符_。这似乎是一个普遍的误解。许多开发人员都弄错了。
All control characters means everything from
'\x00'
to'\x1f'
, not just those with a short representation such as'\x0a'
(also known as'\n'
) .例如,您 必须 将'\x02'
字符转义为\u0002
。另请参阅: ECMA-404 - JSON 数据交换语法,第 2 版,2017 年 12 月,第 4 页
简单的解决方案
如果您确定您的输入字符串是 UTF-8 编码的,那么您可以保持简单。
由于 JSON 允许您通过
\uXXXX
,甚至"
和\
来逃避一切,一个简单的解决方案是:最短表示
对于最短的表示,您可以使用 JSON 快捷方式,例如
\"
而不是\u0022
。以下函数生成 UTF-8 编码字符串s
的最短 JSON 表示:纯switch语句
也可以用纯 switch 语句来相处,即不带
if
和<iomanip>
。虽然这很麻烦,但从“简单和纯粹的安全性”的角度来看,它可能更可取:使用库
您可能想看看 https://github.com/nlohmann/json ,这是一个有效的仅包含标头的 C++ 库(MIT 许可证),似乎经过了很好的测试。
您可以直接调用他们的
escape_string()
方法(请注意,这有点棘手,请参阅 Lukas Salich 下面的评论),或者您可以将他们的实现escape_string()
作为起点你自己的实现:https://github.com/nlohmann/json/blob/ec7a1d834773f9fee90d8ae908a0c9933c5646fc/src/json.hpp#L4604-L4697