RapidJSON如何在使用FindMember时接收成员对象

时间:2016-11-26 08:02:39

标签: c++ rapidjson

我有JSON,我想使用FindMember验证它,然后接收它。 但问题是它确实找到了#34;标题"串 但它不会返回rapidjson :: Value

[{
        "title" : "one",
        "type" : "gg",
        "center" : {    
        },
}]



rapidjson::Document document;
if(!document.Parse(jsonContent.c_str()).HasParseError())
{
        if (document.IsArray())
        {
            for (rapidjson::SizeType i = 0; i < document.Size(); i++) 
            {
                rapidjson::Value& findMemberInJsonNode = FindMemberInJsonNode(&document[i], "title"); 

            }
        }
}



rapidjson::Value& HelloWorld::FindMemberInJsonNode(rapidjson::Value* jsonValue,std::string str)
{
    rapidjson::Value::MemberIterator localMemberItr = jsonValue->FindMember(str.c_str());
    //create null 
    rapidjson::Value &val = rapidjson::Value::GenericValue();
    if (localMemberItr != jsonValue->MemberEnd())
    {
//IT IS ENTER HERE SO it DOES FIND THE "title" STRING
        val = localMemberItr->value;
        if (val.IsNull()) 
        {
            int s = 1;
        }
        else if (val.IsObject())
        {
            int s = 0;
        }
    }
     //IT IS NULL 
    return val;
}

1 个答案:

答案 0 :(得分:1)

您可以在找到成员时返回localMemberItr->value

但问题是,当找不到成员时应该返回什么。

一种可能的解决方案是返回指针而不是引用。因此,您可以在找到成员时返回&localMemberItr->value,如果找不到,则可以nullptr(或0)。

此外,通过使用JSON pointer,它已经完成了您的工作:

#include <rapidjson/pointer.h>

/* ... */

Pointer titlePointer("/title");
if (document.IsArray()) {
    for (rapidjson::SizeType i = 0; i < document.Size(); i++) {
        if (Value* title = titlePointer.Get(documents[i]) {
            // "title" was found and the value is pointed by title
        }
    }
}