2012-06-18 3 views
1

Json.NET을 사용하여 jsTree의 트리 구조를 직렬화 및 비 직렬화하려고합니다. 몇 가지 예를 JSON 여기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; } 
     } 
    } 

그리고있다 :

여기 클래스 정의입니다

[{ 
"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

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

로 구현

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

이유라도 잘 작동하는 것 같다?

+0

이 속성은 기존 트리 코드를 jsTree와 호환되도록 구현되었습니다. 그 세터가 그 일과 관련이 있는지 궁금해하고 있었지만 직설로 많은 코드를 변경하고 싶지 않았습니다. 감사. –

0

클래스 메타 데이터는 비공개입니다. 내가 아는 바로는 이것으로 Json 시리얼 라이저가 액세스하지 못하게된다. 따라서 속성 값을 null로 남겨 둡니다. 내가

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

Metadata 속성을 변경하면

+0

흠, 수업을 공개로 변경 한 후에도 작동하지 않습니다. 다른 아이디어? –

관련 문제