Сравнение ошибки документа Rapidjson - ошибка, оператор [] не соответствует этим операндам

Я пытаюсь сравнить документы Rapidjson, но выдает сообщение об ошибке, которое я не знаю, как исправить (см. выше).

Это Rapidjson:

static const std::string& JSON()
    {
        static const std::string j =
        "{"
            "\"SimpleCompany:Manager\":{"
                "\"read\":\"true\""
                "\"update\":\"true\""
                "\"delete\":\"true\""
                "\"insert\":\"false\""
            "},"
            "\"SimpleCompany:Manager\":{"
                "\"read\":\"true\""
                "\"update\":\"true\""
                "\"delete\":\"false\""
                "\"insert\":\"false\""
            "},"
        "}";

        return j;
    }

Здесь я пытаюсь сравнить два документа с предположительно одинаковым содержанием:

rapidjson::StringStream strStream(JSON().c_str());
rapidjson::Document origDocument;
origDocument.ParseStream(strStream); //newDocument obtained other way
ASSERT_TRUE(newDocument["read"] == origDocument["read"]); //error no operator [] matches these operands
ASSERT_TRUE(strcmp(newDocument["read"] , origDocument["read"])); //error no operator [] matches these operands
const rapidjson::Value& a1 = newDocument["read"]; //error no operator [] matches these operands

Любая идея, как правильно сравнивать их значения? Я попробовал два способа, но им не понравился [.

Майло говорит, что существует оператор равенства. Похоже, я сравниваю такие вещи, как руководство по rapidjson, хотя они сравнивают ключ с ожидаемым значением. , и я сравниваю ключи двух документов на равенство, что мне кажется нормальным.


person Michele    schedule 15.02.2017    source источник


Ответы (2)


Я столкнулся с похожей проблемой. Что нужно проверить/попробовать:

1) Есть ли у вас using namespace rapidjson; в соответствующем кодовом блоке? Я предполагаю, что не потому, что вижу, как вы используете rapidjson:: в объявлении orgiDocument. Я считаю, что часть этой проблемы так же проста, как коллизия пространств имен. (Компилятор не знает, что вы пытаетесь использовать перегруженный оператор [] Rapidjson... я думаю.)

2) Во-вторых, я бы предложил попробовать использовать newDocument["read"].GetBool() для получения значения для ключа «чтение». У меня были проблемы с попыткой заставить мой код работать, следуя этому руководству, и использование этих методов «Получить» - единственный способ, которым я смог фактически получить возвращаемые значения.

Надеюсь это поможет!

person Mough    schedule 01.06.2017

  1. Что такое тип newDocument и как его создать? Я попытался запустить ваш код (создав NewDocument так же, как origDocument), и первое утверждение == сработало. Если newDocument является обычным rapidjson::Document, то строка const rapidjson::Value& a1 = newDocument["read"]; должна скомпилироваться.

  2. Второе утверждение пытается strcmp два объекта Rapidjson Value, поэтому я думаю, что ожидается, что это не скомпилируется. Вместо этого вы должны получить содержимое const char* из значений, используя .GetString() для каждого из них.

Просто чтобы прояснить, что вы хотите сделать, должно работать:

  • operator[] для Document (который на самом деле является подклассом GenericValue) возвращает ссылку на объект GenericValue.

  • Вы можете сравнить GenericValues ​​с ожидаемыми операторами == и !=. См. раздел "Операторы равенства и не равенства" в документации.

person FluxLemur    schedule 19.07.2017