【问题标题】:Deserializing a JSON array of mixed types反序列化混合类型的 JSON 数组
【发布时间】:2010-10-11 00:28:12
【问题描述】:

我在使用 DataContractJsonSerializer 类反序列化混合类型的 JSON 数组时遇到问题。我花了很多时间寻找解决方案无济于事,所以我想我会继续在这里问。

基本上,我得到一个如下所示的 JSON 字符串。我想让数组反序列化为一个列表,其中位置 0 有一个 Int32,位置 1 有一个字符串,位置 2 有一个我的自定义类的实例。

[
   2,
   "Mr. Smith",
   {
      "num":169,
      "name":"main street",
      "state":66
   }
]

如果我像这样创建一个序列化:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>))

我实际上在位置 0 处得到一个 Int32,在位置 1 处得到一个 String。但是在位置 2 处我只得到一个空对象。

有谁知道我正在尝试做的事情是否可能?我无法控制我正在使用的 JSON 的结构。如果可能,我想在不使用第三方程序集的情况下完成此操作。

【问题讨论】:

    标签: c# wcf datacontractjsonserializer


    【解决方案1】:

    你必须创建一个像这样重现 json 结构的类:

    [DataContract]
    public class MyClass {
        [DataMember]
        public int IntMember { get; set; }
        [DataMember]
        public string StringMember { get; set; }
        [DataMember]
        public MyType[] AllTypes { get; set;}
    }
    
    [DataContract]
    public class MyType {
        [DataMember]
        public int num { get; set; }
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public int state { get; set;}
    }
    

    使用“DataContract”和“DataMember”属性装饰类及其属性。然后在您的反序列化代码中使用您创建的类,如下例所示

    var serializer = new DataContractJsonSerializer(typeof(MyClass));
    System.IO.StringReader reader = new System.IO.StringReader(jsonData);
    System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.Default.GetBytes(jsonData));
    return serializer.ReadObject(ms) as MyClass;
    

    【讨论】:

    • 这也是最初的想法。问题是这样的数组不会反序列化为单个类。序列化程序强制将其反序列化为数组。当我尝试这个时,我收到错误“期望状态'元素'..遇到名称为'',名称空间''的'文本'。”
    • 请看一下我上次的编辑。我确实忘记了这是一个元素数组...
    • Lorenzo,感谢您提供代码示例。这似乎也不起作用。这将生成一个 MyClass 的实例,其中 int 成员 = 0,其他两个成员为 null。仍然缺少一些东西......
    • @Mike:请看这里:http://www.codeproject.com/KB/aspnet/AspNetMVCandJqGrid.aspx。除了文章的论点之外,GridModelBinder 类中还有一些代码可以完全按照您的示例执行某些操作。相信我。 :)
    【解决方案2】:

    迈克,

    问题是在反序列化过程中,JSON反序列化器不知道将位置2的元素反序列化成什么类型​​。

    您需要提供“__type”提示。您可以通过在多态情况下将其实际序列化为 JSON 并查看发出的类型提示来获取特定类型的 __type 提示。

    有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb412170.aspx。特别注意“分配给对象的集合”和“保留类型信息”部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 2018-08-16
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多