Boost read_json 无法与来自 std::wstring 的 wptree 一起使用

Boost read_json is not working with wptree from std::wstring

我有一个简单的代码不起作用,我真的不知道为什么...这里是:

std::wstring CDbFilterSerializer::DeserializeFromString(const std::wstring& jsonStr)
{
    std::wistringstream ss{ jsonStr };
    boost::property_tree::read_json(ss, m_root);
    return m_root.data();
}

这里的问题是在调用 m_root.read_json(...) 之后 wptre 对象是空的。 return 语句是一个示例,导致填充 wptree 对象后的真实代码,我调用 m_root.get("MyKey") 开始读取值,这抛出异常导致对象为空。

作为参数收到的json是:

{
"type":{
      "className":"NumericFilterSerializerHelper: NumericType => unsigned int, DbSerializer => class CDbFilterSerializerByNumericValue",
      "description":""
   },
   "data":{
      "int_number":"45"
   }
}

这里有什么问题吗?

是的。这些假设是错误的。 .data() returns 根节点的值,它是空的(因为它是一个对象)。你可以把整个m_tree打印出来看看:

Live On Coliru

#include <boost/property_tree/json_parser.hpp>
#include <iostream>

struct CDbFilterSerializer {
    std::wstring DeserializeFromString(const std::wstring& jsonStr);

    boost::property_tree::wptree m_root;
};

std::wstring CDbFilterSerializer::DeserializeFromString(const std::wstring& jsonStr)
{
    std::wistringstream ss{ jsonStr };
    read_json(ss, m_root);
    return m_root.data();
}

int main() {
    CDbFilterSerializer obj;
    obj.DeserializeFromString(LR"({
"type":{
      "className":"NumericFilterSerializerHelper: NumericType => unsigned int, DbSerializer => class CDbFilterSerializerByNumericValue",
      "description":""
   },
   "data":{
      "int_number":"45"
   }
})");

    write_json(std::wcout, obj.m_root, true);
}

打印

{
    "type": {
        "className": "NumericFilterSerializerHelper: NumericType => unsigned int, DbSerializer => class CDbFilterSerializerByNumericVa
lue",
        "description": ""
    },
    "data": {
        "int_number": "45"
    }
}

如您所见,对象不是空的。您可能将路径拼写错误(我们无法判断,因为 MyKey 不在您的文档中)。

边注

不要为了 JSON“支持”而滥用 属性 树。而是使用 JSON 库!提升 JSON 存在。其他几个是免费提供的。