iterate and retrieve nested object in JSON using rapidjson

后端 未结 5 1618
情书的邮戳
情书的邮戳 2021-01-12 07:20

I am parsing a JSON structure which is similar as follows

{
    \"item1\" : \"value1\"
    \"item2\" : \"value2\"
    // ...
    \"itemn\" : {
          


        
5条回答
  •  春和景丽
    2021-01-12 07:45

    This is something I recently worked on:

    void enter(const Value &obj, size_t indent = 0) { //print JSON tree
    
    if (obj.IsObject()) { //check if object
        for (Value::ConstMemberIterator itr = obj.MemberBegin(); itr != obj.MemberEnd(); ++itr) {   //iterate through object   
            const Value& objName = obj[itr->name.GetString()]; //make object value
    
            for (size_t i = 0; i != indent; ++i) //indent
                cout << " ";
    
            cout << itr->name.GetString() << ": "; //key name
    
            if (itr->value.IsNumber()) //if integer
                std::cout << itr->value.GetInt() ;
    
            else if (itr->value.IsString()) //if string
                std::cout << itr->value.GetString();
    
    
            else if (itr->value.IsBool()) //if bool
                std::cout << itr->value.GetBool();
    
            else if (itr->value.IsArray()){ //if array
    
                for (SizeType i = 0; i < itr->value.Size(); i++) {
                    if (itr->value[i].IsNumber()) //if array value integer
                        std::cout << itr->value[i].GetInt() ;
    
                    else if (itr->value[i].IsString()) //if array value string
                        std::cout << itr->value[i].GetString() ;
    
                    else if (itr->value[i].IsBool()) //if array value bool
                        std::cout << itr->value[i].GetBool() ;
    
                    else if (itr->value[i].IsObject()){ //if array value object
                        cout << "\n  ";
                        const Value& m = itr->value[i]; 
                        for (auto& v : m.GetObject()) { //iterate through array object
                            if (m[v.name.GetString()].IsString()) //if array object value is string
                                cout << v.name.GetString() << ": " <<   m[v.name.GetString()].GetString();
                            else //if array object value is integer
                                cout << v.name.GetString() << ": "  <<  m[v.name.GetString()].GetInt();
    
                           cout <<  "\t"; //indent
                        }
                    }
                    cout <<  "\t"; //indent
                }
            }
    
            cout << endl; 
            enter(objName, indent + 1); //if couldn't find in object, enter object and repeat process recursively 
            }     
     }
     }
    

    This can handle any type of JSON tree. All you have to do is pass a Value as such:

    Value v = document.GetObject();
    Value& m= v;
    enter(m);
    

    And you're done!

提交回复
热议问题