比较rapidjson文档错误 - 错误没有operator []匹配这些操作数

时间:2017-02-15 20:39:38

标签: compare 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

知道如何正确比较他们的价值观吗?我尝试了两种方法,但他们并不喜欢[。

米洛说那里有一个equality operator。看起来我比较像rapidjson tutorial这样的东西,虽然他们正在将密钥与期望值进行比较,并且我比较两个文档的密钥是否相等,这对我来说似乎没问题。

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。 要检查/尝试的事情:

1)您的相关代码块中是否有using namespace rapidjson;?我假设不是因为我看到您在rapidjson::声明中使用orgiDocument。我相信这个问题的一部分就像命名空间碰撞一样简单。 (编译器不知道你正在尝试使用rapidjson的重载[]运算符......我想。)

2)我建议的第二件事是尝试使用newDocument["read"].GetBool()来检索“读取”键的值。我一直在尝试让我的代码在遵循该教程的同时工作,并且使用这些'Get'方法是我能够实际获得返回值的唯一方法。

希望这有帮助!

答案 1 :(得分:0)

  1. newDocument的类型是什么,您如何创建它?我尝试运行您的代码(通过以NewDocument创建origDocument)并且第一个==断言有效。如果newDocument是常规rapidjson::Document,则行const rapidjson::Value& a1 = newDocument["read"];应该编译。

  2. 第二个断言是尝试strcmp两个rapidjson Value对象,所以我认为它不会编译。您应该使用每个值const char*从值中获取.GetString()内容。

  3. 为了弄清楚,你想做什么应该有效:

    • operator[]的{​​{1}}(实际上是GenericValue的子类)返回Document对象引用。

    • 您可以将GenericValues与预期的运算符==和!=进行比较。请参阅“等于和不等于操作员”部分in the docs