2015-03-03 7 views
3

Я пытаюсь прочитать ответ JSON в Касабланке. Полученные данные выглядят так:Анализ массива JSON с использованием casablanca

{ 
"devices":[ 
    {"id":"id1", 
    "type":"type1"}, 
    {"id":"id2", 
    "type":"type2"} 
] 
} 

Кто-нибудь знает, как это сделать? Похоже, что учебные пособия в Casablanca заботятся о создании таких массивов, а не о чтении.

ответ

6

Давайте предположим, что вы получили ваш JSON в качестве ответа HTTP:

web::json::value json; 
web::http::http_request request; 

//fill the request properly, then send it: 

client 
.request(request) 
.then([&json](web::http::http_response response) 
{ 
    json = response.extract_json().get(); 
}) 
.wait(); 

Обратите внимание, что никакой проверки ошибок не делается здесь, так что давайте предположим, что все работает нормально (--Если не смотрите в документации Casablanca и примеры) ,

Возвращенный json затем может быть прочитан через функцию at(utility::string_t). В вашем случае это массив (вы либо знаете, что или проверить его с помощью is_array()):

auto array = json.at(U("devices")).as_array(); 
for(int i=0; i<array.size(); ++i) 
{ 
    auto id = array[i].at(U("id")).as_string(); 
    auto type = array[i].at(U("type")).as_string(); 
} 

При этом вы получите записи из ответа JSon хранится в строковых переменных.

В действительности, вы также можете проверить, имеет ли ответ соответствующие поля, например. через has_field(U("id")), и если да, проверьте, не являются ли записи не null через is_null() - в противном случае функция as_string() выдает исключение.

+1

Благодарю вас за хороший ответ! – barneytron

+1

Отлично, работает! –

+1

Ваш ответ правильный. – Prince

5

Ниже приведена рекурсивная функция, которую я сделал для разбора значений JSON в cpprestsdk, если вы хотите, чтобы дополнительная информация или разработка не стеснялись спрашивать.

std::string DisplayJSONValue(web::json::value v) 
{ 
    std::stringstream ss; 
    try 
    { 
     if (!v.is_null()) 
     { 
      if(v.is_object()) 
      { 
       // Loop over each element in the object 
       for (auto iter = v.as_object().cbegin(); iter != v.as_object().cend(); ++iter) 
       { 
        // It is necessary to make sure that you get the value as const reference 
        // in order to avoid copying the whole JSON value recursively (too expensive for nested objects) 
        const utility::string_t &str = iter->first; 
        const web::json::value &value = iter->second; 

        if (value.is_object() || value.is_array()) 
        { 
         ss << "Parent: " << str << std::endl; 

         ss << DisplayJSONValue(value); 

         ss << "End of Parent: " << str << std::endl; 
        } 
        else 
        { 
         ss << "str: " << str << ", Value: " << value.serialize() << std::endl; 
        } 
       } 
      } 
      else if(v.is_array()) 
      { 
       // Loop over each element in the array 
       for (size_t index = 0; index < v.as_array().size(); ++index) 
       { 
        const web::json::value &value = v.as_array().at(index); 

        ss << "Array: " << index << std::endl; 
        ss << DisplayJSONValue(value); 
       } 
      } 
      else 
      { 
       ss << "Value: " << v.serialize() << std::endl; 
      } 
     } 
    } 
    catch (const std::exception& e) 
    { 
     std::cout << e.what() << std::endl; 
     ss << "Value: " << v.serialize() << std::endl; 
    } 

    return ss.str(); 
} 
+1

Только для справки о будущем помните, что пользователи могут быть возвращены на этот пост, и это приведет к дополнительным вопросам по этому вопросу. Лучше всего добавить всю информацию, необходимую для этого. –

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