在C#中动态键的深度Json对象中访问元素

时间:2018-07-27 06:28:28

标签: json json.net

我目前正在处理图形数据库中的JSON数据,该数据库的键本质上是动态的

"A": {
  "key": {
    "id": "A",
  },
  "value": {
    "B": {
       "key": {
         "id": "B",
       },
       "value": {
         "D": {
           "key": {
             "id": "D",
           },
         "value": {},
    "C":{
       "key": {
         "id": "C",
        },
       "value": {}
 }

其中key存储节点信息,值存储子信息。

这里A是根节点,而B和C是其子节点。类似地,对于B,D是子节点。有什么办法可以为每个父节点获取其子节点的ID,例如对于A(我知道),我想要其子节点的ID,即B和C。

先谢谢您。

1 个答案:

答案 0 :(得分:1)

首先,您在问题中使用的JSON无效。缺少括号和多余的逗号。如果按照您的描述,我认为应该是这样的:

{
  "A": {
    "key": {
      "id": "A"
    },
    "value": {
      "B": {
        "key": {
          "id": "B"
        },
        "value": {
          "D": {
            "key": {
              "id": "D"
            },
            "value": {}
          }
        }
      },
      "C": {
        "key": {
          "id": "C"
        },
        "value": {}
      }
    }
  }
}

您可以使用以下类对该结构进行建模:

class Node
{
    public Key Key { get; set; }
    public Dictionary<string, Node> Value { get; set; }
}

class Key
{
    public string Id { get; set; }
}

然后,像这样反序列化JSON:

var result = JsonConvert.DeserializeObject<Dictionary<string, Node>>(json);

要获取给定节点的子ID列表,可以向Node类添加一个简短的辅助方法:

public List<string> GetChildIds()
{
    return Value.Select(kvp => kvp.Value.Key.Id).ToList();
}

然后您可以像这样使用它:

Node a = result["A"];
List<string> ids = a.GetChildIds();
Console.WriteLine(string.Join(", ", ids));

输出:

B, C

提琴:https://dotnetfiddle.net/MOeA69