2014-11-13 3 views
1

Моего объекта JSON имеет список в нем, и я хотел бы итерацию по элементам списка я увидел следующий пост Iterating through objects in JsonCpp, но это не работает для меняJSONcpp перебирать список внутри объект

Мой объект JSON:

{ 
     "name": ["str1",str2" ... ] 
} 

код, который у меня есть, и не работает

Json::Value names= (*json)["name"]; 
for(Json::ValueIterator itr = names.begin() ; itr != names.end() ; itr++) { 
    string name = *itr.asString();} 

Я получаю следующее сообщение об ошибке

cannot convert from 'Json::Value' to 'std::basic_string<_Elem,_Traits,_Ax> 

Я уверен, что элементы строки, потому что вызов string name = names= (*json)["name"][0].asString() работает

ответ

3

Я не понимаю, как вы можете получить ошибку cannot convert из вашего кода, но я думаю, что я вижу проблему.

Json::ValueIterator - итератор; другими словами, подобно указателю, он должен быть разыменован для доступа к значению, на которое он указывает.

  • itr.asString() пытается получить доступ к asString методу итератора и итератор не имеет asString метода.
  • *itr.asString() пытается получить доступ к asString методу итератора затем разыменовать результат (из-за порядка операции; . имеет более высокий приоритет, чем *), а итератор не имеет asString метода.
  • (*itr).asString() (с использованием скобок для уточнения приоритета) или itr->asString() (с использованием оператора ->, предпочтительный подход) должен работать.
+0

Спасибо за разъяснение (* ITR) решается вопрос – Quantico

+1

Добро пожаловать. Однако вы должны использовать 'itr->' вместо '(* itr) .'; они означают одно и то же, но '->' чище и является общепринятым стилем. –

+0

Вы уверены, что itr-> asString()? Я получаю тип «Json :: ValueIterator» не имеет оператора перегруженного участника -> ' – Quantico

5

В C++ 11 его еще проще в настоящее время:

for (auto itr : json["names"]) { 
    string name = itr.asString(); 
    // ... 
} 
Смежные вопросы