如何使用boost :: property_tree访问JSON数组?

时间:2011-07-01 08:35:42

标签: json boost

int main(int argc, char *argv[])
{

    QCoreApplication a(argc, argv);

    // string s = "{\"age\":23,\"study\":{\"language\":{\"one\":\"chinese\",\"subject\":[{\"one\":\"china\"},{\"two\":\"Eglish\"}]}}}";

    string s = "{\"age\" : 26,\"person\":[{\"id\":1,\"study\":[{\"language\":\"chinese\"},{\"language1\":\"chinese1\"}],\"name\":\"chen\"},{\"id\":2,\"name\":\"zhang\"}],\"name\" : \"huchao\"}";
    ptree pt;
    stringstream stream(s);
    read_json<ptree>( stream, pt);

    int s1=pt.get<int>("age");
    cout<<s1<<endl;

    string s2 = pt.get<string>("person."".study."".language1");
    cout<<s2<<endl;

现在我想获得language1的价值。

1 个答案:

答案 0 :(得分:0)

首先,我要问为什么你有一个包含这些不同元素的列表?如果language1具有某些特殊含义,那么我会将数据拆分为studystudy1或类似的内容。通常,列表应该是单一类型。

假设您无法更改格式,以下是您问题的答案。据我所知,从数组中获取内容的唯一方法是迭代它。

#include <boost/foreach.hpp>

BOOST_FOREACH(const ptree::value_type& val, pt.get_child("person.study"))
{
  boost::optional<string> language1Option = v.second.get_optional<string>("language1");
  if(language1Option) {
    cout<<"found language1: "<<*language1Option<<endl;
  }
}

此代码迭代“study”列表中的所有内容,并查找带有“language1”键的条目,打印结果