如何使对象支持反序列化
本文关键字:反序列化 支持 对象 何使 | 更新日期: 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);