【问题标题】:Deserialize JSON folder structure into C# Object将 JSON 文件夹结构反序列化为 C# 对象
【发布时间】:2014-09-24 06:13:25
【问题描述】:

我在 JSON 中有一个文件夹结构,我需要将其反序列化为 c# 对象。我想知道如何在不设置多个子类对象的情况下做到这一点(因为可能有大量子文件夹)。我在想可能是继承父对象的子对象,或者拥有一个包含自身的对象可能是要走的路,但我很难过!

干杯!

JSON 结构:

 [
  {
    type: "folder",
    name: "animals",
    path: "/animals",
    children: [
      {
        type: "folder",
        name: "cat",
        path: "/animals/cat",
        children: [
          {
            type: "folder",
            name: "images",
            path: "/animals/cat/images",
            children: [
              {
                type: "file",
                name: "cat001.jpg",
                path: "/animals/cat/images/cat001.jpg"
              }, {
                type: "file",
                name: "cat001.jpg",
                path: "/animals/cat/images/cat002.jpg"
              }
            ]
          }
        ]
      }
    ]
  }
]

Json2CSharp 输出:

public class Child3
{
    public string type { get; set; }
    public string name { get; set; }
    public string path { get; set; }
}

public class Child2
{
    public string type { get; set; }
    public string name { get; set; }
    public string path { get; set; }
    public List<Child3> children { get; set; }
}

public class Child
{
    public string type { get; set; }
    public string name { get; set; }
    public string path { get; set; }
    public List<Child2> children { get; set; }
}

public class RootObject
{
    public string type { get; set; }
    public string name { get; set; }
    public string path { get; set; }
    public List<Child> children { get; set; }
}

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    只要结构一直相同,你应该只需要这样的东西:

    public class Node {
        public string type {get;set;}
        public string name {get;set;}
        public string path {get;set;}
        public List<Node> children {get;set;}
    }
    

    如果它是null,大多数序列化程序将完全忽略该列表。

    例如,通过Jil

    List<Node> nodes = Jil.JSON.Deserialize<List<Node>>(json);
    

    并序列化:

    var obj = new List<Node>
    {
        new Node
        {
            type = "folder",
            name = "animals",
            path = "/animals",
            children = new List<Node>
            {
                new Node
                {
                    type = "folder",
                    name = "cat",
                    path = "/animals/cat",
                    children = new List<Node>
                    {
                        new Node
                        {
                            type = "folder",
                            name = "images",
                            path = "/animals/cat/images",
                            children = new List<Node>
                            {
                                new Node
                                {
                                    type = "file",
                                    name = "cat001.jpg",
                                    path = "/animals/cat/images/cat001.jpg"
                                  },
                                new Node {
                                    type = "file",
                                    name = "cat001.jpg",
                                    path = "/animals/cat/images/cat002.jpg"
                                }
                            }
                        }
                    }
                }
            }
        }
    };
    string json = Jil.JSON.Serialize(obj, Jil.Options.PrettyPrint);
    

    【讨论】:

      【解决方案2】:

      当您说C# object 时,我喜欢认为不涉及自定义类。 你可以使用dynamic:

      var serializer = new JavaScriptSerializer();
      serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
      
      dynamic obj = serializer.Deserialize(e.Parameters, typeof(object));
      

      然后你可以访问这样的属性:

      string type = obj.type as string;
      string name = obj.name as string;
      ...
      

      DynamicJsonConverter的代码可以在here找到

      【讨论】:

        猜你喜欢
        • 2012-12-15
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        相关资源
        最近更新 更多