2012-06-18 198 views
1

我想使用Json.NET来为jsTree序列化和反序列化树结构。Json.NET不反序列化嵌套对象

下面是类定义:

private class Metadata 
    { 
     [JsonProperty(PropertyName = "nodeType")] 
     public NodeType NodeType; 

     [JsonProperty(PropertyName = "typeDepth")] 
     public int TypeDepth; 
    } 

    private class TreeNode 
    { 
     [JsonProperty(PropertyName = "data")] 
     public String Title; 

     [JsonIgnore] 
     public NodeType NodeType; 

     [JsonIgnore] 
     public int TypeDepth; 

     [JsonProperty(PropertyName = "children", NullValueHandling = NullValueHandling.Ignore)] 
     public List<TreeNode> Children; 

     [JsonProperty(PropertyName = "metadata")] 
     public Metadata Metadata 
     { 
      get 
      { 
       return new Metadata() {NodeType = NodeType, TypeDepth = TypeDepth}; 
      } 

      set { 
       TypeDepth = value.TypeDepth; 
       NodeType = value.NodeType; 
      } 
     } 

     private ItemGroup _itemGroup; 

     [JsonIgnore] 
     public ItemGroup ItemGroup 
     { 
      get 
      { 
       if(this.NodeType != NodeType.ItemGroup) 
        throw new InvalidDataException(); 

       return _itemGroup; 
      } 

      set { _itemGroup = value; } 
     } 
    } 

,这里是一些例子JSON:

[{ 
"data":"Strands", 
"attr":{"class":""}, 
"state":"open", 
"metadata":{ 
    "nodeType":3, 
    "typeDepth":0}, 
"children":[{ 
    "data":"Math", 
    "attr":{"class":"","rel":"itemGroup"}, 
    "state":"open", 
    "metadata":{ 
     "nodeType":1, 
     "typeDepth":0}, 
    "children":[{ 
     "data":"Subjects", 
     "attr":{"class":""}, 
     "state":"open", 
     "metadata":{"nodeType":3,"typeDepth":1}, 
     "children":[{ 
      "data":"Algebra 1", 
      "attr":{"class":"","rel":"itemGroup"}, 
      "state":"open", 
      "metadata":{ 
       "nodeType":1, 
       "typeDepth":1}, 
      "children":[{ 
       "data":"Clusters", 
       "attr":{"class":""}, 
       "state":"open", 
       "metadata":{ 
        "nodeType":3, 
        "typeDepth":2}, 
       "children":[{ 
        "data":"Factoring", 
        "attr":{"rel":"itemGroup"}, 
        "metadata":{ 
         "nodeType":1, 
         "typeDepth":2}}, 
        {"data":"Substitution", 
        "attr":{"class":"","rel":"itemGroup"}, 
        "metadata":{"nodeType":1,"typeDepth":2}}]}]}]}]}]}] 

我尝试反序列化这样的:List<TreeNode> tree = (List<TreeNode>)JsonConvert.DeserializeObject(form["treeJson"], typeof (List<TreeNode>));

树状结构正确反序列化,但没有任何节点具有元数据。

有人看到这里有什么问题吗?

谢谢!

回答

1

当我改变Metadata财产

[JsonProperty(PropertyName = "metadata")] 
public Metadata Metadata { get; set; } 

它似乎做工精细

var tree = JsonConvert.DeserializeObject<List<TreeNode>>(jsonstring); 

任何理由将其实现为

[JsonProperty(PropertyName = "metadata")] 
public Metadata Metadata 
{ 
    get 
    { 
     return new Metadata() {NodeType = NodeType, TypeDepth = TypeDepth}; 
    } 
    set { 
      TypeDepth = value.TypeDepth; 
      NodeType = value.NodeType; 
    } 
} 

+0

该属性被实现为使现有树代码与jsTree兼容。想知道这个二传手是否与它有关,但并不想在预感上改变一堆代码。谢谢。 –

0

类的元数据是私有的。据我所知,这将阻止Json串行器访问它;因此,它会将属性值留空;

+0

嗯,改为上课后仍然没有工作。任何其他想法? –