2

我在使用 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 处得到一个字符串。但是在位置 2 处,我只得到一个空对象。

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

4

2 回答 2

2

您必须创建一个重现 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;
于 2010-10-11T00:43:49.603 回答
1

麦克风,

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

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

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

于 2011-02-02T02:29:11.120 回答