Анализ строки массива json с использованием jsoncpp - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть JSON:

[{"header": "test" , "test2" : "test2"}]

Я пытаюсь разобрать это, используя jsoncpp.

Вот мой фрагмент кода :

 Json::CharReaderBuilder builder;
 Json::CharReader *reader = builder.newCharReader();
 Json::Value root;
 bool parseRet = reader->parse(serverResponse.c_str(),serverResponse.c_str() +serverResponse.size(), &root, &errors);

parseRet возвращает true. Но root не включает json данных.

Как мне разобрать это?

1 Ответ

1 голос
/ 14 февраля 2020

parseRet возвращает true. Но root не включает JSON данных.

Это похоже на проблему с доступом к проанализированным элементам JSON.


Ниже это полный рабочий пример с необработанным строковым литералом в качестве JSON ввода.

Несколько моментов:

  • Использование std :: unique_ptr для reader для соответствующего выделения памяти в конце. В вашем фрагменте кода это утечка памяти.
  • Внимательно прочитайте документацию! Доступ к элементу с использованием метода или оператора может вернуть значение по умолчанию или исключение , поэтому обрабатывайте его соответствующим образом. Например, JSON в root является массивом, поэтому к нему должен обращаться индекс, а затем каждый индекс содержит объект, например root[0]["header"].

Пример (C ++ 11):

#include <iostream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>

int main()
{
    const std::string raw_json = R"json([{"header": "test" , "test2" : "test2"}])json";

    Json::CharReaderBuilder builder {};

    // Don't leak memory! Use std::unique_ptr!
    auto reader = std::unique_ptr<Json::CharReader>( builder.newCharReader() );

    Json::Value root {};
    std::string errors {};
    const auto is_parsed = reader->parse( raw_json.c_str(),
                                          raw_json.c_str() + raw_json.length(),
                                          &root,
                                          &errors );
    if ( !is_parsed )
    {
        std::cerr << "ERROR: Could not parse! " << errors << '\n';
        return -1;
    }

    std::cout << "Parsed JSON:\n" << root << "\n\n";

    try
    {
        std::cout << "header: " << root[0]["header"] << '\n';
        std::cout << "test2 : " << root[0]["test2"] << '\n';
    }
    catch ( const Json::Exception& e )
    {
        std::cerr << e.what() << '\n';
    }

    return 0;
}

Выход:

Parsed JSON:
[
    {
        "header" : "test",
        "test2" : "test2"
    }
]

header: "test"
test2 : "test2"
...