如何使用 boost 属性树来解析 boost 中 json 字符串中的数组中的元素?
How to use boost property tree to parse elements from array in json string using boost?
我有一个看起来像这样的json字符串:
[
"some text",
648547,
94.0,
111.0267520223,
10
]
所以我需要为每个值分配一个变量,例如:
std::string value1 = "some text";
int value2 = 648547;
float value3 = 94.0;
float value4 = 111.0267520223;
int value5 = 10;
阅读 JSON,使用 Boost,我在做这样的事情
std::stringstream jsonResponse;
boost::property_tree::ptree pt;
jsonResponse << "["some text", 648547, 94.0, 111.0267520223, 10]";
std::istringstream is(jsonResponse);
boost::property_tree::read_json(is, pt);
但是我不知道如何从属性树中读取数组值。
有人知道如何做到这一点吗?
提前感谢!
这是我迭代无命名数组的解决方案:
boost::property_tree::basic_ptree<std::string,std::string>::const_iterator iter = pt.begin(),iterEnd = pt.end();
for(;iter != iterEnd;++iter)
{
//->first; // Key. Array elements have no names
//->second; // The object at each step
std::cout << "=> " << iter->second.get_value<std::string>() << std::endl;
}
您需要命名数组,以便可以引用它:
{
"blah": [
"some text",
648547,
94.0,
111.0267520223,
10
]
}
这将在 jsonlint.com 上进行验证,但使用属性树阅读仍然不简单。
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/exceptions.hpp>
#include <boost/exception/diagnostic_information.hpp>
#include <boost/foreach.hpp>
typedef boost::property_tree::iptree ptree_t;
typedef ptree_t::value_type ptree_value_t;
typedef boost::optional<ptree_t &> optional_ptree_t;
void parseMyJson()
{
optional_ptree_t ptBlah = pt.get_child_optional("blah");
if (ptBlah)
{
BOOST_FOREACH (property_tree_t::value_type & field, pt.get_child("blah"))
{
}
}
}
使用这种代码,您可以迭代字段,但由于它们是不同的类型,因此解析起来并不简单。
我建议您考虑命名字段,以便可以直接引用它们。
例如
field.second.get<string>("fieldname", "");
请记住将此代码包装在 trycatch 块中,因为 boost 属性树会在出现问题的第一个迹象(例如解析失败或找不到字段等(时引发异常。
您可能希望考虑使用更加用户友好的 json 库 (https://github.com/nlohmann/json(。
相关文章:
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 你如何从 Boost Spirit X3 词法解析器中获取字符串?
- boost::spirit::x3 中的简单字符串解析器不起作用
- 为什么要 boost::p roperty_tree::write_json() 将整数值转换为字符串?这是不正确的
- 如何在Boost::program_options配置文件中为非字符串的自定义选项值类型处理空格
- 如何使用 Boost C++ 打印第 n 个字符串拆分?
- boost::带有布尔值和字符串的变体
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 如何使用 boost 属性树来解析 boost 中 json 字符串中的数组中的元素?
- boost::async_write 跳过字符串的一部分
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- Boost.Hana JSON 示例:字符串和 decltype(std::to_string(..))之间的区别
- C++ Boost 1.66 使用 Beast http 请求解析器解析字符串
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- 我如何知道 boost::any 是否包含文字字符串
- Boost字符串算法错误
- 使用带有绑定的boost字符串算法谓词
- 使用CString与boost字符串算法-减少到一个类型定义
- 将boost字符串算法与迭代器结合使用