如何访问 jsoncpp 值的键

问题描述

问这个我有点傻,但一直没能找到一种方法获取 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];

无论如何,这不是生产质量,但我希望它指向正确的方向。