代码之家  ›  专栏  ›  技术社区  ›  LeMoussel

boost ptree access第一个元素,没有路径名

  •  1
  • LeMoussel  · 技术社区  · 6 年前

    我正在使用boost库操作JSON字符串,我想访问第一个元素。

    我想知道是否有一些方便的方法可以访问没有路径名的ptree的第一个元素。

    我这样做了,但没有任何价值:

    namespace pt = boost::property_tree;
    pt::ptree pt2;
    string json = "\"ok\"";
    istringstream is(json);
    try
    {
            pt::read_json(is, pt2);
            cout << pt2.get_child("").equal_range("").first->first.data() << endl;
    }
    catch (std::exception const& e)
    {
            cerr << e.what() << endl;
    }
    

    解决方案:

    代替 cout << pt2.get_child("").equal_range("").first->first.data() << endl;

    通过 cout << pt2.get_value<std::string>() << endl;

    2 回复  |  直到 6 年前
        1
  •  1
  •   sehe    6 年前

    首先,属性树是 JSON库。

    其次,输入是 在库支持的JSON子集中( e.g. )。

    第三,由于输入的结果是 子节点,则应使用根节点本身的值。

    最后,如果你 想要第一个节点,请使用 ordered_begin()->second :

    Live On Coliru

    #include <boost/property_tree/json_parser.hpp>
    #include <boost/property_tree/xml_parser.hpp>
    #include <iostream>
    
    void broken_input() {
        boost::property_tree::ptree pt;
        std::istringstream is("\"ok\"");
        read_json(is, pt);
        std::cout << "Root value is " << pt.get_value<std::string>() << std::endl;
    }
    
    void normal_tree() {
        boost::property_tree::ptree pt;
        pt.put("first", "hello");
        pt.put("second", "world");
        pt.put("third", "bye");
    
        std::cout << pt.ordered_begin()->second.get_value<std::string>() << std::endl;
    
        write_json(std::cout, pt);
    }
    
    
    int main() {
        try {
            broken_input();
            normal_tree();
        }
        catch (std::exception const& e)
        {
            std::cerr << e.what() << std::endl;
        }
    }
    

    印刷品

    Root value is ok
    hello
    {
        "first": "hello",
        "second": "world",
        "third": "bye"
    }
    
        2
  •  0
  •   3CxEZiVlQ    6 年前

    我想访问第一个元素。

    一般情况下,这是不可能的,因为JSON元素的位置不是由定义固定的。当前的第一个元素可以在JSON转换后更改其位置,生成的JSON将是相同的,尽管元素被重新排序。因此,BOOST不提供此类API。