You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"(
            })");

但获取值后结果仍一致。

疑问:

  1. 若最终目标是显示真实字符而非转义序列,为何API会返回此类格式?
  2. 是否存在无需手动转义每个值即可正常显示的方法?

问题解答

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:57:05