【问题标题】:c# Json get all parent and child valuesc# Json获取所有父子值
【发布时间】:2022-01-07 20:21:15
【问题描述】:

我有一个 json 字符串。

根据类别,json 字符串中有多个子类别。 我想把它们全部结合起来。 它应该始终给出更高级别的最后一个子级别的 Id。

示例:

Id   - Name
--     ----------
1239 - Accessory> Jewelery > wristband> Silver wristband 

谁能帮帮我。谢谢

    {
  "categories": [
    {
      "id": 368,
      **"name": "Accessory ",**
      "parentId": null,
      "subCategories": [
        {
          "id": 396,
          **"name": "Jewelery ",**
          "parentId": 368,
          "subCategories": [
            {
              "id": 397,
              **"name": "wristband",**
              "parentId": 396,
              "subCategories": [
                {
                  "id": 1238,
                  "name": "Gold wristband",
                  "parentId": 397,
                  "subCategories": []
                },
                {
                  **"id": 1239,**
                  "name": "Silver wristband",
                  "parentId": 397,
                  "subCategories": []
                },
                {
                  "id": 2845,
                  "name": "Steel wristband",
                  "parentId": 397,
                  "subCategories": []
                },
                {
                  "id": 3171,
                  "name": "Pearl wristband",
                  "parentId": 397,
                  "subCategories": []
                },
                {
                  "id": 3883,
                  "name": "diamond wristband",
                  "parentId": 397,
                  "subCategories": []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

这是我的课

public class SubCategory
    {
        public int id { get; set; }
        public string name { get; set; }
        public int parentId { get; set; }
        public List<object> subCategories { get; set; }
    }

    public class Category
    {
        public int id { get; set; }
        public string name { get; set; }
        public object parentId { get; set; }
        public List<SubCategory> subCategories { get; set; }
    }

    public class Root
    {
        public List<Category> categories { get; set; }
    }

【问题讨论】:

  • 您尝试过什么?您在尝试转换 JSON 时是否有任何错误可以分享?
  • 我给了一个样本。我想知道我该怎么做。
  • 哦,感谢@huMpty duMpty 的编辑,我意识到我的答案不是你问的,我会尽快编辑它

标签: c# json .net


【解决方案1】:

我想你可以放弃 SubCategory,List&lt;object&gt; 到底在做什么?

假设你可以反序列化

public class Category
{
    public int id { get; set; }
    public string name { get; set; }
    public int? parentId { get; set; }   // int?
    public List<Category> subCategories { get; set; }  // <Category>
}

public class Root
{
    public List<Category> categories { get; set; }
}

那么你可以使用一个简单的深度优先递归访问者:

string FindCategoryTrail(List<Category> categories, int id)
{
   foreach(var category in categories)
   {
       if (category.id == id)  return category.name;

       var trail = FindCategoryTrail(category.subCategories , id);
       if (trail != null)
       {
          return category.name + " > " + trail;
       }
   }
   return null;
}

然后这样称呼它

string trail = FindCategoryTrail(myRoot.categories, 1239);

【讨论】:

  • 该死我正要编辑我的答案以发布(几乎)相同的代码,你更快:(
  • 非常感谢汉克。这正是我想要的。和其他人谢谢大家
【解决方案2】:

使用 Linq,您可以展平嵌套列表:

public class Category
{
    public int id { get; set; }
    public string name { get; set; }
    public object parentId { get; set; }
    public List<Category> subCategories { get; set; }
}

public class Root
{
    public List<Category> categories { get; set; }
}

        IEnumerable<Category> Flatten(IEnumerable<Category> e) => e.SelectMany(c => Flatten(c.subCategories)).Concat(e);

        Root root = JsonConvert.DeserializeObject<Root>(File.ReadAllText(@"U:\test1.json"));
        var search = Flatten(root.categories).Where(c => c.id == 1239);

        foreach(var s in search)
        {
            System.Diagnostics.Debug.WriteLine($"id: {s.id}");
            System.Diagnostics.Debug.WriteLine($"name: {s.name}");
            System.Diagnostics.Debug.WriteLine($"parentid: {s.parentId}");
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多