API返回含双重转义的JSON,nlohmann json解析后如何正常显示?
问题详情
从API打印出未使用nlohmann json解析的原始响应如下:
{ "Pages": { "Limit": 10, "CurrentPage": 1 }, "Messages": [ { "Subject": "\"Some subject that is surrounded with escaped quotes and has double escaped escape sequences for example: \\u015b \"", "Body": "\"The body is structured in the same way\"" }, ... ], "Resources": { "Messages\\Unread": { "Url": "..." }, ... } }
解析后执行以下C++代码:
json data = json::parse(response); std::cout << data["Messages"][0]["Subject"];
输出结果为:
"Some subject with double quotes surrounding it and an single escaped escape sequences: \u015b"
尝试将响应值构造为新的JSON字符串并再次解析,代码如下:
json parsed_subject_json = json::parse(R"( { "Body":)" + (std::string)data["Messages"][0]["Body"] + R"( })");
但获取值后结果仍一致。
疑问:
- 若最终目标是显示真实字符而非转义序列,为何API会返回此类格式?
- 是否存在无需手动转义每个值即可正常显示的方法?
问题解答
为什么API返回这种格式?
API返回的JSON中,字符串本身就包含转义字符和未解析的Unicode转义序列,这不是JSON格式的问题,而是API将转义后的内容作为字符串的实际值返回了。比如\"是字符串里的实际双引号文本,\\u015b是字符串里的实际转义序列文本(而非直接的Unicode字符ś)。
这种情况通常是API端的实现失误:要么是数据存储时就保存了转义后的内容,要么是API序列化时错误地对字符串做了双重转义,把原本应该解析成字符的转义序列,当成了普通文本保留下来。
无需手动转义的解决方法
nlohmann库本身提供了处理字符串转义的能力,只需利用JSON解析逻辑再次处理单个字符串值即可:
正确的二次解析方式
把带转义的字符串包裹成合法的JSON字符串字面量,再解析一次,nlohmann会自动处理所有转义序列:
std::string escaped_subject = data["Messages"][0]["Subject"]; // 将字符串用双引号包裹,构造成合法的JSON字符串值 json temp = json::parse("\"" + escaped_subject + "\""); std::string unescaped_subject = temp.get<std::string>(); std::cout << unescaped_subject << std::endl;
执行后会输出真实字符:Some subject that is surrounded with escaped quotes and has double escaped escape sequences for example: ś "
为什么你之前的尝试没生效?
你之前拼接的JSON存在语法问题:原字符串中的引号会破坏对象结构,加上换行和空格的干扰,导致解析时无法正确识别转义序列。直接处理单个字符串值(而非拼接成对象)才是正确的思路。
内容的提问来源于stack exchange,提问作者sentientbottleofwine
相关产品推荐
相关产品推荐

