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
打印出来看看:
#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 存在。其他几个是免费提供的。
我有一个简单的代码不起作用,我真的不知道为什么...这里是:
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
打印出来看看:
#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 存在。其他几个是免费提供的。