2017-02-15 6 views
0

Я пытаюсь сравнить документы quickjson, но он дает сообщение об ошибке, что я не уверен, как исправить (см. Выше).Сравнение errorjson document error - error no operator [] соответствует этим операндам

Это 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 

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

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

ответ

0

У меня возникла аналогичная проблема. Вещи, чтобы проверить/попробуйте:

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

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

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

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

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

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

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

  • Вы можете сравнить GenericValues ​​с ожидаемыми операторами == и! =. См. Раздел «Операторы равных и не равных» in the docs.