Как напечатать массив JSON

Я пытался, но кажется слишком много петель. Есть ли оптимальный путь?

Введите JSON:

{"errors":[{"key":"XYZ","code":37373,"message":"Invalid XYZ Code"}]}

Жесткий код ключ в решении, а не проблема.

Я попытался напечатать нижеприведенное решение:

if(!aJsonDocument.Parse<0>(aResponseJson.c_str()).HasParseError())
{
for(rapidjson::Value::ConstMemberIterator iter = aJsonDocument.MemberBegin(); iter != aJsonDocument.MemberEnd(); ++iter)
{
if(iter->name.IsString() && iter->value.IsArray())
{
std::string aKey = iter->name.GetString();
const rapidjson::Value& aJsonData = aJsonDocument[aKey.c_str()];
if(aJsonData.IsArray())
{
for (rapidjson::SizeType i = 0; i < aJsonData.Size(); i++)
{
for(rapidjson::Value::ConstMemberIterator iter1 = aJsonData[i].MemberBegin(); iter1 != aJsonData[i].MemberEnd(); ++iter1)
{
std::string aKey = iter1->name.GetString();
boost::trim(aKey);
std::string aValue = iter1->value.GetString();
boost::trim(aValue);
std::cout<< "Key: " << aKey << ", Value:" << aValue << endl;;

}
}
}
}
}
}

0

Решение

Вы можете сначала использовать JSON-схема в RapidJSON для проверки JSON, поэтому вам не нужно вручную кодировать все проверки, такие как IsObject(), IsArray(), так далее.

Затем для итерации массива и объектов в C ++ 11 вы можете использовать диапазон на основе для:

for (auto& error : d["errors"].GetArray())
for (auto& m : error.GetObject())
std::cout << m.name.GetString() << ", " << m.value.GetString() << std::endl;
1

Другие решения

Отказ от ответственности мне нравится ThorsSerializer; но я написал это так предвзято. Если это работает для ваших нужд, не стесняйтесь использовать его.

Разобрать код так же просто, как объявить объекты, которые вы хотите построить.

Код

#include "ThorSerialize/JsonThor.h"#include "ThorSerialize/SerUtil.h"#include <sstream>
#include <iostream>
#include <string>
#include <vector>

struct Error
{
std::string             key;
int                     code;
std::string             message;
};
ThorsAnvil_MakeTrait(Error, key, code, message);

struct MyData
{
std::vector<Error>      errors;
};
ThorsAnvil_MakeTrait(MyData, errors);

Пример использования:

int main()
{
using ThorsAnvil::Serialize::jsonImport;
using ThorsAnvil::Serialize::jsonExport;

std::stringstream   inputData(R"({"errors":[{"key":"XYZ","code":37373,"message":"Invalid XYZ Code"}]})");

MyData    object;
inputData >> jsonImport(object);

std::cout << object.errors[0].key       << "\n";
std::cout << object.errors[0].code      << "\n";
std::cout << object.errors[0].message   << "\n";

std::cout << "-----\n";
std::cout << jsonExport(object) << "\n";
}

Выход:

XYZ
37373
Invalid XYZ Code
-----

{
"errors": [
{
"key": "XYZ",
"code": 37373,
"message": "Invalid XYZ Code"}]
}
0

По вопросам рекламы [email protected]