如何反序列化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;