假设我将JSON数据格式化为:(树数据类型:)
{
“NODEDATA”:
[
“nodeObject”:
{
“nodeName”:“节点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):
因为数据是一种树,List可能不适合这种数据吗?
如何解决此问题?
谢谢,伙计们。如果json数据格式良好,那么我使用以下类型的代码来反序列出上述数据的对象:
var jsonSerializer = new DataContractJsonSerializer(typeof(List<nodeObject>));
var nodes = jsonSerializer.ReadObject(e.Result) as List<nodeObject>;
this.listBox1.ItemsSource = nodes;
但我仍然为节点获取null。
不确定如何使用此knid树数据反序列化对象。
答案 0 :(得分:1)
你的json是无效的javascript。您无法为数组元素定义键。例如,在代码的第一行:
[
"nodeObject":
{ "nodeName":
//...
]
您的代码需要格式化为:
[ {"nodeName": "Node-1-1"}, {"nodeName": "Node-1-2"} /* ... */ ]
答案 1 :(得分:1)
您的数据无效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验证您的数据。
答案 2 :(得分:0)
请注意,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;