Как разобрать массив в корне с 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: есть ли лучший jason parser для C++ с легким интерфейсом?
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";
}