2015-08-08 3 views
1

Я знаю, как разобрать «нормальный» вид JSON данные в C++. Обычно я делаю это, используя метод boost::property_tree и read_json. Это может выглядеть так:Как разбирать вложенные массивы внутри json с помощью C++

BOOST_FOREAH(ptree::value_type &v, pt.get_child("rows"){ 
    vec.push_back(v.second.get<std::string>("key")); 
} 

и выше код соответствует этому JSON файла:

{ 
    "rows":[{ 
     "key":"1" 
    },{ 
     "key":"2" 
    }] 
} 

Однако Neo4j множества результатов, которые я получаю, выглядит следующим образом:

{ 
    "columns":{...}, 
    "data":[[["object 1"]], [["object 2"]], [["object 3"]]] 
} 

Я заинтересован и хочу разобрать "data" узел. Я попытался сделать это так:

BOOST_FOREAH(ptree::value_type &v, pt.get_child("data"){ 
    vec.push_back(v.second.data()); 
} 

но это не работает. Я не получаю ошибку, но мой вектор vec остается пустым, а точнее он заполнен пустыми значениями. Итак, когда я повторяю этот vec, я вижу несколько элементов, но они не имеют никакого значения. Принимая во внимание, что я хочу иметь значения "object 1", "object 2", "object 3".

+0

https://github.com/jeaye/jeayeson, json_spirit, чтобы назвать только две библиотеки, которые сделают это. –

+0

Эти библиотеки выглядят перспективными, но вы на 100% уверены, что они будут разбирать мой json-файл? – Jacobian

+1

@Jacobian Если библиотека утверждает, что поддерживает синтаксический анализ стандартного JSON, тогда он будет анализировать стандартный JSON, иначе это будет ошибкой. Или ваш вопрос непонятен. –

ответ

1

Раствор выглядит следующим образом:

using boost::property::ptree; 
ptree pt; 
//... populate ptree pt with data from some source 
BOOST_FOREACH(ptree::value_type &v, pt.get_child('data')){ 
    ptree subtree1 = v.second; 
    BOOST_FOREACH(ptree::value_type &vs, subtree1){ 
     ptree subtree2 = vs.second; 
     BOOST_FOREACH(ptree::value_type &vs2, subtree2){ 
      do_something(vs2.second.data()); 
     } 
    } 
} 

Этот код позволяет анализировать такую ​​JSON структуру:

{ 
"data":[[["object 1"]], [["object 2"]], [["object 3"]]] 
} 

Так что, вопреки тому, что некоторые люди говорят, на самом деле, не существует необходимо использовать другие сторонние библиотеки. Используйте только boost, и все готово.

+0

Хотя, мне этот код не нравится. Хотелось бы, чтобы было какое-то упрощение. Поскольку копирование вставки 'BOOST_FOREACH' выглядит довольно техническим. – Jacobian

+0

Действительно. Часто нет необходимости * для сторонних библиотек. Хотя вам просто повезло, это покрывает ваши потребности. Удачи, если вам нужно отформатировать правильный номер JSON. Вот почему еще хуже для evangelise Boost Property Tree в качестве библиотеки JSON. – sehe

Смежные вопросы