Как разобрать массив в корне с помощью rapidjason

У меня есть следующий код.

Document d;
const char* json = "[{\"k1\":\"1\"}, {\"k1\":\"2\"}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    cout << d[i]["k1"].GetInt() << "\n";
}

Я получаю ошибку ниже, когда запускаю это:

rapidjson/include/rapidjson/document.h:1700: int rapidjson::GenericValue<Encoding, Allocator>::GetInt() const [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `data_.f.flags & kIntFlag' failed.

Один из способов, который я понял, - это использовать Writer, который принимает stringBuffer. Он возвращает мне вложенную строку элемента массива.

 rapidjson::StringBuffer sb;
 rapidjson::Writer<rapidjson::StringBuffer> writer1( sb );
 d[0].Accept( writer1 );
 std::cout << sb.GetString() << std::endl;

Результат вышеуказанной альтернативы:

{"k1":"1"}

Я могу вернуть вывод строки выше для повторного анализа. Есть ли способ разобрать это напрямую?

PS: Есть ли лучший парсер Джейсона для С++ с простым интерфейсом?


person Bhupendra dubey    schedule 07.10.2017    source источник
comment
1 — это не int — это строка — поэтому вам нужно получить ее с помощью d[i]["k1"].GetString(). Int будет представлен в json без кавычек. После извлечения строки типа 1 из json вы можете использовать stoi для преобразования ее в int.   -  person Artemy Vysotsky    schedule 07.10.2017


Ответы (1)


Вы, как программист, должны знать формат строки JSON, которую вы сериализуете или десериализуете. Похоже, в этом случае вы считаете строковые значения целыми числами.

Теперь, чтобы исправить это, вы можете либо рассматривать их как строки, а затем преобразовывать эти строковые значения в целые числа с помощью стандартных утилит C++, либо вы можете обновить строку JSON, чтобы она содержала целые числа.

Первый подход (хотя преобразование в int выполняется не самым лучшим образом):

Document d;
const char* json = "[{\"k1\":1}, {\"k1\":2}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    int d;
    sscanf(d[i]["k1"].GetString(), "%d", &d);
    cout << d << "\n";
}

Второй подход:

Document d;
const char* json = "[{\"k1\":1}, {\"k1\":2}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    cout << d[i]["k1"].GetInt() << "\n";
}
person ilim    schedule 07.10.2017