变量作为文档索引

variable as document index

本文关键字:索引 文档 变量      更新时间:2023-10-16

我正在使用rapidjson库来解析json数据。

例如,为了读取一个元素,我使用以下代码:

Document d;
d.Parse(json); //Parse JSON data
d["name"].Accept(writer)

它将其发送到StringBuffer,StringBuffer允许我将数据作为字符串读取。但现在我正努力让这本书充满活力。现在我读取字段"name",但这可能有所不同。所以我想用一个变量来做这个,我试过这个:

String s = "name";
d[s].Accept(writer)

但这会导致错误

表达式必须具有整型或非量程枚举类型

我该如何解决这个问题?

当您调用d["name"]时,由于c++运算符重载,我无法判断实际发生了什么,但"name"基本上是const char*,而不是String。

所以我认为

const char* s = "name";
d[s].Accept(writer);

会更好用。

实际上,在c++中,标准运算符[]被定义为采用std::size_t。字符串不能强制转换为std::size_t,但任何指针(如const char*(都可以。这就是所谓的"整数或无范围枚举"。

但对于映射类型,[]运算符可以取非整数值,例如复杂对象或其他任何值。但您的运算符[]的行为似乎与标准数组下标类似。

BTW:在rapidjson中(我刚刚检查了github源代码(,GenericDocument是一个具有运算符的GenericValue

GenericValue& operator[](const std::basic_string<Ch>& name) { return (*this)[GenericValue(StringRef(name))]; }

因此,您可以使用std::string

当我们不知道变量的类型时,很难回答这个问题。我假设d是一个求解集合,它包含具有Accept函数的MyClass类型的某些对象。

如果你想要这样的行为,你必须使用类似std映射的东西。

它是这样使用的:

// The key type is string and the value type is myClass
//  key     value
map<string, MyClass> myDict;
myDict["name"].Accept(writer);

现在,您可以拥有一个与MyClass关联的字符串。

顺便说一句,string从小写开始。编译器找不到String

编辑:啊!d的类型是json文档!如果你想像这样操作json文档,你必须使用一个外部库,比如jsoncpp

编辑:似乎您已经使用了json库。