Как проверить, существует ли вложенный элемент Rapidjson - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть JSON Файл, подобный этому

{
    "Person":[
        {
            "name":"Frank",
            "age":69,
            "amount_of_jobs":9,
            "years_worked":6,
            "unemployed":true,
            "job_seeking":false
        },
        {
            "name":"Tom",
            "age":23,
            "amount_of_jobs":2,
            "years_worked":6,
            "unemployed":false,
            "job_seeking":false
        },
        {
            "name":"Mike",
            "age":31,
            "amount_of_jobs":5,
            "years_worked":12,
            "unemployed":false,
            "job_seeking":false
        },
        {
            "name":"Herb",
            "age":45,
            "amount_of_jobs":7,
            "years_worked":29,
            "unemployed":false,
            "job_seeking":true
        }
    ],
    "Companies":[
        {
            "name":"Slave Inc"
        },
        {
            "name":"Some LLC"
        },
        {
            "name":"Other PTY LTD"
        },
        {
            "name":"A company"
        }
    ]
}

, и я хотел бы проверить, есть ли в файле правильные ключи.

Мне удалось проверить, Person и Companies существует с этим фрагментом кода

if (!document.HasMember("Person") || (!document.HasMember("Companies")))
{
    std::cout << "KEY NOT FOUND" << std::endl;
    file.close();
    return false;
}
else
{      
    std::cout << "ALL GOOD" << std::endl;
}

Но когда я пытаюсь проверить, существуют ли name или years_worked (которые являются вложенными элементами), это не работает.

Я пробовал:

if (!document.HasMember("name") || (!document.HasMember("years_worked")))
{
    std::cout << "KEY NOT FOUND" << std::endl;
    file.close();
    return false;
}
else
{      
    std::cout << "ALL GOOD" << std::endl;
}

и

if (!document["Person"].HasMember("name") || (!document["Person"].HasMember("years_worked")))
{
    std::cout << "KEY NOT FOUND" << std::endl;
    file.close();
    return false;
}
else
{      
    std::cout << "ALL GOOD" << std::endl;
}

, и все, что я получаю, это:

Утверждение не удалось: (IsObject ())

Как я могу решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Person - это массив, поэтому вы должны обращаться к нему как к массиву, то есть по индексу.

Пример:

document["Person"][0].HasMember("name")

То же самое относится к Companies.

0 голосов
/ 06 апреля 2020

Вам нужно запросить массив Person, чтобы вам нужно было указать индекс.

Например (см. документация ):

document["Person"][ <index> ].HasMember( <member-name> )

Если вы Если вы хотите проверить name и years_worked для всего массива, вы можете использовать диапазон, основанный на этом (см. документация ):

assert( document["Person"].IsArray() );

for ( const auto& i : document["Person"].GetArray() )
{
    assert( i.HasMember("name") );
    assert( i.HasMember("years_worked") );
}

Вы можете пройти / запросить другие массивы, как это.

...