如何反序列化JSON数据树?

问题描述:

假设我有JSON格式的数据:(一种树的数据:)如何反序列化JSON数据树?

{ “NODEDATA”: [ “nodeObject”:
{ “节点名称”: “节点1”,

"nodeChildren": 
     [ 
      "nodeObject": 
      { 
      "nodeName": "Node 1-1" 
      }, 
      "nodeObject": 
      { 
      "nodeName": "Node 1-2" 

      }, 
      "nodeObject": 
      { 
      "nodeName": "Node 1-3",  
      "nodeChildren": 
       [ 
        "nodeObject": 
        { 
        "nodeName": "Node 1-3-1"   
        } 
       ] 
      }, 

      "nodeObject": 
      { 
      "nodeName": "Node 1-4" 

      }, 

      "nodeObject": 
      { 
      "nodeName": "Node 1-5",   
      } 
     ] 
}, 

"nodeObject": 
{ 
"nodeName": "Node 2", 
}, 

"nodeObject": 
{ 
"nodeName": "Node 3", 
} 

] }

为了反序列化该数据,在SL应用程序,我所限定的内部类以匹配像JSON数据模型:

[DataContract] 
internal class nodeObject 
{ 
    [DataMember] 
    public string nodeName;  
    [DataMember] 
    public nodeObject nodeChildren; 
} 

然后使用DataContractJsonSerializer来获取数据,但我有一种错误的说:在JSON

意外的字符遇到。预期',',得到':'。 (37):

由于数据是种树,列表可能对这种数据不好?

如何解决此问题?


谢谢,伙计们。如果JSON数据很好地格式化,然后我用下面那种代码deserializ对象为上述数据:

var jsonSerializer = new DataContractJsonSerializer(typeof(List<nodeObject>)); 
var nodes = jsonSerializer.ReadObject(e.Result) as List<nodeObject>; 
this.listBox1.ItemsSource = nodes; 

但是我还是空的节点。

不知道如何使用这些树数据反序列化对象。

您的json无效javascript。您无法为数组元素定义键。例如,在你的代码的第一行:

[ 
    "nodeObject": 
     { "nodeName": 
      //... 
] 

你的代码就需要像这样被格式化:

[ {"nodeName": "Node-1-1"}, {"nodeName": "Node-1-2"} /* ... */ ] 

你的数据是无效的JSON。我已将其重新格式化为

{ 
    "nodeData": [ 
     "nodeObject", 
     { 
      "nodeName": "Node 1", 
      "nodeChildren": [ 
       "nodeObject", 
       { 
        "nodeName": "Node 1-1" 
       }, 
       "nodeObject", 
       { 
        "nodeName": "Node 1-2" 
       }, 
       "nodeObject", 
       { 
        "nodeName": "Node 1-3", 
        "nodeChildren": [ 
         "nodeObject", 
         { 
          "nodeName": "Node 1-3-1" 
         } 
        ] 
       }, 
       "nodeObject", 
       { 
        "nodeName": "Node 1-4" 
       }, 
       "nodeObject", 
       { 
        "nodeName": "Node 1-5" 
       } 
      ] 
     }, 
     "nodeObject", 
     { 
      "nodeName": "Node 2" 
     }, 
     "nodeObject", 
     { 
      "nodeName": "Node 3" 
     } 
    ] 
} 

使用JSON Lint验证您的数据。

请注意,DataContractJsonSerializer仅支持以下编码:UTF-8,UTF-16LE和UTF-16BE。为此,您需要执行以下操作:

   DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<Client>)); 

       System.IO.MemoryStream clientListStream = new System.IO.MemoryStream(); 

       clientListStream.Write(System.Text.Encoding.UTF8.GetBytes(e.Result), 0, e.Result.Length); 

       List<Client> Clients = json.ReadObject(clientListStream) as List<Client>; 
       dgMain.ItemsSource = Clients;