使用Boost将JSON数组值解析为std :: string

时间:2015-07-10 19:43:31

标签: c++ boost

我正在尝试使用以下代码解析std :: string JSON字符串:

        std::string ss = "{ \"id\" : \"abc123\", \"number\" : \"0123456789\", \"somelist\" : [{ \"timestamp\" : \"May 1, 2015\" , \"data\" : { \"description\" : \"some description\", \"value\" : \"100.000000\" } }] }";

        ptree pt2;
        std::istringstream is(ss);
        read_json(is, pt2);
        std::string _id = pt2.get<std::string>("id");
        std::string _number = pt2.get<std::string>("number");
        std::string _list = pt2.get<std::string>("somelist"); 


        for (auto& e : pt2.get_child("somelist")) {
            std::cout << "timestamp: " << e.second.get<std::string>("timestamp") << "\n";
            for (auto& e1 : pt2.get_child("data")){ // not working
                std::cout << "description: " << e1.second.get<std::string>("description") << "\n";
                std::cout << "value: " << e1.second.get<std::string>("amount") << "\n";
            }
        }

虽然我的目标不是打印子项(也不是将JSON字符串转换为C ++数组)。上面的代码不起作用。

我想知道如何将data的值不是数组或其他东西,就像这样的字符串[{ "timestamp" : "May 1, 2015" , "data" : { "description" : "some description", "value" : "100.000000" } }]

只需要将JSON数组作为std :: string

1 个答案:

答案 0 :(得分:1)

import re from datetime import date def parse_date(path): """Return date stored in the *path* or None on any error.""" try: year1, year2, month = map(int, re.findall(r'\d+', path)) if year1 == year2: return date(year2, month, 1) except ValueError: pass 实现boost/property_tree/json_parser.hpp,正如您所料,它是write_json的倒数。由于read_json将数组存储为具有空键的对象,因此要实现所需的表示,您可以遍历ptree中的顶级ptree,调用pt2.get_child("somelist")他们每个人都按照你的意愿格式化这些表示。

write_json

Coliru Demo