问题描述
问这个我有点傻,但一直没能找到一种方法来获取 JSON 值的键。如果我有对象的迭代器,我知道如何检索密钥。我也知道operator[]
。
在我的情况下,键不是已知值,因此不能使用 get(const char *key)
或 operator[]
。也找不到 getKey()
方法。
我的 JSON 如下所示:
{Obj_Array: [{"122":{"Member_Array":["241","642"]}}]}
对于解析 {"122":{"Member_Array":["241","642"]}}
的一段代码,我想使用类似 get_key()
的函数来检索 "122"
但似乎我必须使用一个迭代器,这对我来说似乎是矫枉过正。
我可能根本不了解 jsoncpp
如何表示 JSON 文件。
解决方法
首先,您在 JsonCPP 中无法解析的内容。键必须始终用双引号括起来:
{"Obj_Array": [{"122":{"Member_Array":["241","642"]}}]}
假设这只是一个疏忽,如果我们添加空格并标记元素:
{
root-> "Obj_Array" : [
elem0-> {
key0-> "122":
val0-> {
key0.1-> "Member_Array" :
val0.1-> [
elem0.1.0-> "241",elem0.1.1-> "642" ]
}
}
]
}
假设您已设法将数据读入 Json::Value
(我们称之为 root
),每个标记值都可以这样访问:
elem0 = root[0];
val0 = elem0["122"]
val0_1 = val0["Member_Array"];
elem0_1_0 = val0_1[0];
elem0_1_1 = val0_1[1];
您注意到这仅检索值;密钥是先验。这并不罕见;键定义了数据的模式;您必须了解它们才能直接访问这些值。
在您的问题中,您声明这不是一个选项,因为密钥未知。将语义应用于未知键可能具有挑战性,但您已经找到了答案。如果要获取键值,则必须遍历封闭的 Json::Value 的元素。
因此,要到达 key0
,您需要这样的东西(未经测试):
elem0_members = elem0.getMemberNames();
key0 = elem0_members[0];
无论如何,这不是生产质量,但我希望它指向正确的方向。