当我尝试为我的person对象反序列化json字符串时,我得到InvalidOperationException。它声明我的Person对象不支持反序列化
[DataContract]
public class Person
{
public string FirstName {get;set;}
public string LastName {get; set;}
public int Id {get; set;}
}
json字符串的示例
[{"name":"FirstName","value":"John"},{"name":"LastName","value":"Doe"},{"name":"Id","value":"1001"}]
这就是我得到异常的地方
Person p = new JavaScriptSerializer().Deserialize<Person>(json);
我已经尝试过DataContractJsonSerializer,但没有太多运气。
答案 0 :(得分:3)
这里的问题是json字符串是人的数组(人?!?),而不是单Person
。
将反序列化更改为
Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);
它会起作用。
[编辑 - 回复您的评论] 是的 - 这将给出三个Person实例, - 实际上,它们都具有null / zero属性。
我怀疑你真的在期待这个 json字符串会为你提供原始代码:
string json = "[{\"FirstName\":\"John\", \"LastName\":\"Doe\",\"Id\":\"1001\"}]";
这是一个单身人士,John Doe,身份证号为1001.但如果反序列化为Person
,这不是json所说的。
原始json 可以被反序列化的是一个名称/值对的数组,如下所示:
public class NameValuePair
{
public string name;
public string value;
}
使用此
var p = new JavaScriptSerializer().Deserialize<NameValuePair[]>(json);
希望这个片段更好地说明了json和类之间的关系。
答案 1 :(得分:2)
我已经测试了您的代码并发现了问题。
您的jSon字符串提供了一个Person
数组。更改为Person[]
,它将起作用。
这是我的测试代码
string json = "[{\"name\":\"FirstName\",\"value\":\"John\"},{\"name\":\"LastName\",\"value\":\"Doe\"},{\"name\":\"Id\",\"value\":\"1001\"}]";
Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);
您的jSon字符串格式不正确。反序列化器无法找到属性来分配您的值。
权利是。
{ "NameOfProperty" : "ValueOfProperty" }
这是一种正确的格式
[{"FirstName":"Jon", "LastName":"Doe"}, {"FirstName":"Jon", "LastName":"Doe"}]
测试代码
string json = "[{\"FirstName\":\"Jon\", \"LastName\":\"Doe\"}, {\"FirstName\":\"Jon\", \"LastName\":\"Doe\"}]";
Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);