如何使对象支持反序列化?

时间:2012-02-09 12:46:58

标签: c# json model-view-controller

当我尝试为我的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,但没有太多运气。

2 个答案:

答案 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);