【问题标题】:How to Print JSON Array如何打印 JSON 数组
【发布时间】:2018-07-02 09:59:39
【问题描述】:

我试过了,但循环似乎太多了。有没有最优的方法?

输入 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;;

                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 没有其他方法可以这样做。你可以使用 foreach 循环而不是使用 for
  • 对于未知深度,您可能需要使用递归。
  • 只是想避免这么多 for 循环而已。想知道有没有什么快速的方法。

标签: c++ arrays json rapidjson jsondoc


【解决方案1】:

您可以先使用JSON schema in RapidJSON 来验证JSON,这样您就不需要手动编码所有检查,例如IsObject()IsArray() 等。

然后,要在 C++11 中迭代数组和对象,您可以使用基于范围的 for:

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

【讨论】:

    【解决方案2】:

    免责声明我喜欢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"
                }]
        }
    

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2011-10-30
      • 2019-08-26
      • 2012-01-11
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多