如何使对象支持反序列化

本文关键字:反序列化 支持 对象 何使 | 更新日期: 2023-09-27 18:23:49

当我尝试反序列化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,但运气不太好。

如何使对象支持反序列化

这里的问题是json字符串是Persons(people?!?)的数组,而不是单个Person

将反序列化更改为

Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);

它会起作用的。

[编辑-回应您的评论]是的-这将提供三个Person实例,-事实上,它们都具有null/zero属性。

我怀疑你真的在期待这个json字符串会给你的原始代码带来什么:

string json = "[{'"FirstName'":'"John'", '"LastName'":'"Doe'",'"Id'":'"1001'"}]";

这是一个身份证为1001的单身人士,John Doe。但如果取消序列化为Person,json并不是这么说的。

原始json可以反序列化为一个名称/值对数组,如下所示:

public class NameValuePair
{
    public string name;
    public string value;
}

使用这个

var p = new JavaScriptSerializer().Deserialize<NameValuePair[]>(json);

希望这个片段能更好地说明json和类之间的关系。

我已经测试了您的代码并发现了问题。

您的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);