Рапидджсон

У меня есть такая строка JSON:

{"callCommand":{"command":"car","floor":"2","landing":"front"}}

Теперь я хотел бы проверить, есть ли имя с именем command, и получить значение. Является ли это возможным? Мой код выглядит следующим образом, но он не работает.

const char json[] = "{\"callCommand\":{\"command\":\"car\",\"floor\":\"2\",\"landing\":\"front\"}}";

rapidjson::Value::ConstMemberIterator itr = d.FindMember("command");

if (itr != d.MemberEnd())
    printf("command = %s\n", d["callCommand"]["command"].GetString());

person Felipe Castillo    schedule 05.05.2015    source источник


Ответы (2)


Вы ищете «команда» на верхнем уровне документа:

d.FindMember("command");

Когда вы должны искать его внутри «callCommand»:

d["callCommand"].FindMember("command");

Кроме того, после поиска с помощью FindMember вам следует использовать итератор вместо повторного поиска с помощью оператора []. Что-то вроде:

// assuming that "callCommand" exists
rapidjson::Value& callCommand = d["callCommand"];
rapidjson::Value::ConstMemberIterator itr = callCommand.FindMember("command");

// assuming "command" is a String value
if (itr != callCommand.MemberEnd())
    printf("command = %s\n", itr->value.GetString());
person Ian    schedule 18.07.2017
comment
Это решение работает, только если вы знаете, как устроен json. К сожалению, FindMember не работает рекурсивно. - person Carlos Vargas; 17.07.2019

Вы можете использовать функцию Rapidjson HasMember следующим образом:

Document doc;
doc.Parse(json);
doc.HasMember("command");//true or false
person gokturk    schedule 15.12.2015
comment
согласно их собственной документации следует использовать FindMember. rapidjson.org/md_doc_tutorial.html - person Peter van Leeuwen; 03.10.2019