2014-09-24 82 views
2

我有一个JSON文件夹结构,需要反序列化为一个c#对象。我想知道如何在不设置多个子类对象的情况下做到这一点(因为可能有大量的子文件夹)。我在想也许一个继承父对象的子对象,或者有一个包含它自己的对象可能是要走的路,但我很难过!将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; } 
} 

回答

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); 
+0

谢谢!这帮助了我的问题! – jessemillman 2014-09-24 10:17:38

0

当你说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