读取数组中每个对象的所有键值对

时间:2017-07-21 21:39:15

标签: c++ json rapidjson

这是我的JSON对象:

{
    "resources":[
        {
            "Foo":0,
            "Bar":"",
            "Fiz":1
        },
        {
            "Foo":2,
            "Bar":"",
            "Fiz":3
        }
    ]
}

上述JSON数组resources被正确检测为array。我想迭代数组中的每个对象,并将key:value对添加到map

它确实正确地检测了对象的数量(此处为:2)。 但是如何迭代对象成员呢?有一个断言,数组中的每个元素都不是对象。我不明白,为什么!

这是我的代码:

if ( jsonvalue->IsArray() ){ // that jsonvalue is my "resources" array
    for (rapidjson::SizeType i = 0; i < jsonvalue->Size(); i++){
        const rapidjson::Value& c = jsonvalue[i];
        // Is no object! assertion triggers in next call.
        for (rapidjson::Value::ConstMemberIterator iter = c.MemberBegin(); iter != c.MemberEnd(); ++iter){
            printf("%s\t", iter->name.GetString());
            printf("%s\t", iter->value.GetString());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您将所有值视为string,但在您的JSON中,键值为Int类型。因此,在打印之前,您需要首先检查每个value的类型。

以下是一个例子:

printf( "%s\t", iter->name.GetString() );

if ( iter->value.IsInt() )
{
    printf( "%d\t", iter->value.GetInt() );
}
else if ( iter->value.IsString() )
{
    printf( "%s\t", iter->value.GetString() );
}

我想知道为什么你没有使用C ++ 11基于范围的for循环进行迭代。 RapidJSON支持这一点。请参阅Example

您的代码将更具可读性和紧凑性。