【问题标题】:How to make a object support deserialization?如何使对象支持反序列化?
【发布时间】:2012-02-09 12:46:58
【问题描述】:

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

【问题讨论】:

    标签: c# json model-view-controller


    【解决方案1】:

    这里的问题是 json 字符串是一个 array 人物(人?!?),而不是单个 Person

    将反序列化更改为

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

    它会起作用的。

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

    我怀疑你真的期待 this json 字符串会为你提供原始代码:

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

    这是一个人,John Doe,id 为 1001。但如果反序列化为 Person,json 并不是这样说的。

    你原来的 json 可以被反序列化成一个名称/值对的数组,如下所示:

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

    使用这个

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

    希望这个 sn-p 能更好地说明 json 和类之间的关系。

    【讨论】:

    • 谢谢,这让它无一例外地运行,但是我返回了一个由三个人组成的数组,而不是一个具有 json 字符串值的人
    【解决方案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 字符串格式不正确。 Deserializer 找不到要分配您的值的属性。

    正确的是。

    { "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);
    

    【讨论】:

    • 我得到一个由三个人组成的数组,但他们都没有有效值。提供的 json 字符串应该导致数组只有一个人。
    • 再次感谢!我将研究如何生成字符串:)
    • 很高兴为您提供帮助!祝你有美好的一天!
    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2014-01-23
    • 2011-02-27
    • 2019-06-03
    • 2019-03-09
    相关资源
    最近更新 更多