如何打印 JSON 数组
How to Print JSON Array
我试过了,但似乎循环太多了。有什么好的方法吗?
输入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;;
}
}
}
}
}
}
免责声明我喜欢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"
}]
}
您可以先使用JSON schema in RapidJSON来验证JSON,这样您就不需要手动编写所有检查代码,例如IsObject()
、IsArray()
等.
然后,要在 C++11 中迭代数组和对象,可以使用 range-based for:
for (auto& error : d["errors"].GetArray())
for (auto& m : error.GetObject())
std::cout << m.name.GetString() << ", " << m.value.GetString() << std::endl;
我试过了,但似乎循环太多了。有什么好的方法吗?
输入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;;
}
}
}
}
}
}
免责声明我喜欢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"
}]
}
您可以先使用JSON schema in RapidJSON来验证JSON,这样您就不需要手动编写所有检查代码,例如IsObject()
、IsArray()
等.
然后,要在 C++11 中迭代数组和对象,可以使用 range-based for:
for (auto& error : d["errors"].GetArray())
for (auto& m : error.GetObject())
std::cout << m.name.GetString() << ", " << m.value.GetString() << std::endl;