我有一个简单的代码不起作用,我真的不知道为什么。。。在这里:
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()
返回根节点处的值,该值为空(因为它是一个对象(。您可以打印整个m_tree
以查看:
在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库!Boost JSON存在。其他一些是免费提供的。