【问题标题】:Boost read_json is not working with wptree from std::wstringBoost read_json 不适用于来自 std::wstring 的 wptree
【发布时间】:2022-01-18 08:49:06
【问题描述】:

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

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"
   }
}

这里有什么问题吗?

【问题讨论】:

  • @JasonAller 让我们保持所有 boost- 标签的前缀一致。 ptree 不是软件中的东西 - 如果是,它与 boost-propertytree 无关。我意识到ptree 存在,但它应该与更频繁的boost-propertytree 合并
  • @sehe 你的意思是在评论中标记我,还是使用标记的作者?
  • @JasonAller 啊,我看不到编辑,所以我推测它一定是标签。不是这样的,很抱歉打扰你:)

标签: c++ json boost boost-propertytree


【解决方案1】:

是的。假设是错误的。 .data() 返回根节点的值,它是空的(因为它是一个对象)。你可以打印整个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 库! Boost JSON 存在。其他几个是免费提供的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多