【问题标题】:Accessing element in deep Json object where keys are dynamic in C#访问深度 Json 对象中的元素,其中键在 C# 中是动态的
【发布时间】:2018-07-27 06:28:27
【问题描述】:

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

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

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

这里A是根节点,B和C是它的子节点。同样对于 B,D 是子节点。有什么方法可以让每个父节点获取其子节点的 id 例如对于 A(我知道)我想要其子节点的 id 即 B 和 C。

提前谢谢你..

【问题讨论】:

  • 如果您设计或选择合适的数据模型,当然可以。你现在用什么?您是加载到 JToken 还是反序列化到某些 POCO 集?如果是后者,你能分享一下你到目前为止所拥有的吗?
  • 我现在正在使用 JToken..但是如果你能帮助我为后者提供一些链接,那将非常有帮助。

标签: json json.net


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多