首页 > 解决方案 > 如何打印 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;;

                    }
                }
            }
        }
    }
}

标签: c++arraysjsonrapidjsonjsondoc

解决方案


您可以先在 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;

推荐阅读