c++ - 如何打印 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;;
}
}
}
}
}
}
解决方案
您可以先在 RapidJSON 中使用 JSON 模式来验证 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;
推荐阅读
- ios - ios - 使用新版本更新时,AppStore 中的 App url 链接是否可能更改?请标记任何描述此内容的文章或文档
- powerbi - Power Bi Soap 请求
- javascript - 使用 jsPDF 和 html2canvas 创建 PDF 的问题
- c# - 从 RTF 字节数组中获取超链接
- zephir - Zephir 函数返回的值只能赋值给变体变量
- spring-session - Spring Session 重写 cookie 值并在成功的 HTTP 请求上失败
- json - Laravel API 在 windows(本地机器)和 linux 服务器(托管)中给出不同的 json 结果
- javascript - 选定的下拉值应在立即列值中更新
- python - 使用 Django Sites 设置特定于站点的静态文件夹
- python - 从 Python 运行 Kotlin 脚本并获取输出