字典<string,jtoken =“”>递归搜索

时间:2019-04-11 14:58:30

标签: c# json linq json.net

我将DeserializeObject转换为C#对象,但是我具有带有动态对象名称的对象,因此我将其结构如下:

public class RootObject
{
    public string name { get; set; }
    public TableLayout table{ get; set; }
}

public class TableLayout 
{
    public Attributes attributes { get; set; } //Static
    public Info info { get; set; } //Static
    [JsonExtensionData]
    public Dictionary<string, JToken> item { get; set; }
}

因此,基本上所有出现的动态对象都将添加到字典中,并且使用JsonExtensionData可以填充属性的其余部分,而无需创建对象类。这是我的json:

string json = @"
            {
            "name": "Table 100",
            "table": {
                "attributes ": {
                    "id": "attributes",
                    "type": "attributes"
                },
                "info": {
                    "id": "info",
                    "type": "info"
                },
                "item-id12": {
                    "id": "item-id12",
                    "type": "Row"
                    "index": 0
                },
                "item-id16": {
                    "id": "item-id16",
                    "type": "Column"
                    "parentid": "item-id12"
                },
                "item-id21": {
                    "id": "item-id21",
                    "type": "Column",
                    "parentid": "item-id12"
                }
            }
        }";

如何使用类型=“ row”和索引值(对索引1进行递增以评估下一行)属性使用我的字典中列对象的parentId获取所有列。

所需的输出:

         "item-id12": {
                    "id": "item-id12",
                    "type": "Row"
                    "index": 0
                },
                "item-id16": {
                    "id": "item-id16",
                    "type": "Column"
                    "parentid": "item-id12"
                },
                "item-id21": {
                    "id": "item-id21",
                    "type": "Column",
                    "parentid": "item-id12"
                }

1 个答案:

答案 0 :(得分:1)

您可以使用linq查找您的根对象

var rootNode = json.table.item.Values
      .FirstOrDefault(x => x["type"].Value<string>() == "Row" && x["index"].Value<int>() == 0);

if (rootNode == null)
    return; // no such item

现在,如果该项目存在,请再次使用linq并从字典中获取所有项目:

var childNodes = json.table.item.Values
      .Where(x => x["parentid"]?.Value<string>() == rootNode["id"].Value<string>());

下一个代码

var output = new[] {rootNode}.Concat(childNodes);
foreach (var item in output)
    Console.WriteLine(item);

将打印

{
  "id": "item-id12",
  "type": "Row",
  "index": 0
}
{
  "id": "item-id16",
  "type": "Column",
  "parentid": "item-id12"
}
{
  "id": "item-id21",
  "type": "Column",
  "parentid": "item-id12"
}

P.S。您输入的json无效,缺少几个逗号