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

为何nlohmann::json直接赋值字符串未隐式解析JSON,导致与json::parse结果不一致?

为何nlohmann::json直接赋值字符串未隐式解析JSON,导致与json::parse结果不一致?

这坑我当初刚上手nlohmann/json库的时候也踩过!咱们一步一步说清楚问题出在哪:

1. 两种初始化方式的本质区别

  • json j = json::parse(jsonstr);
    这个调用的是库提供的解析函数,它会把你传入的JSON格式字符串完整解析成对应的JSON对象结构(嵌套键值对的那种)。所以j是一个object类型的JSON值,里面自然包含"id"这个键,第一个断言能通过也完全符合预期。

  • json jj = jsonstr;
    这行调用的是nlohmann::json的字符串构造函数——它不会去解析输入的字符串内容,而是把整个jsonstr当成一段普通文本,直接包装成一个string类型的JSON值。换句话说,此时的jj根本不是JSON对象,它就是个存了整段JSON文本的字符串而已!

2. 为什么get_string拿不到"id"?

你的get_string函数开头判断j.contains(key),但contains方法只有当JSON值是对象类型时,才会检查键是否存在。如果是字符串类型的JSON值,contains会直接返回false,函数就会进入默认分支返回空字符串"",这就是第二个断言失败的核心原因。

你可以加两行调试代码验证类型差异:

std::cout << "j的类型:" << j.type_name() << std::endl; // 输出 object
std::cout << "jj的类型:" << jj.type_name() << std::endl; // 输出 string

3. 怎么解决?

想要让jj和j完全等价,必须明确调用解析操作:

// 方式1:直接用parse构造
json jj = json::parse(jsonstr);
// 方式2:先声明对象再赋值解析结果
json jj;
jj = json::parse(jsonstr);

这样jj就会被正确解析为JSON对象,get_string也能正常拿到"id"对应的值"123"了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:55:30