为何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
相关产品推荐
相关产品推荐

