我无法使用DataContractJsonSerializer类反序列化混合类型的JSON数组。我花了很多时间寻找一个无济于事的解决方案,所以我想我会继续问这里。
基本上,我得到的JSON字符串如下所示。我想让数组反序列化为一个List,其中position 0有一个Int32,position 1有一个String,而position 2有一个我自定义类的实例。
[
2,
"Mr. Smith",
{
"num":169,
"name":"main street",
"state":66
}
]
如果我只是这样创建一个序列号:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>))
我实际上在位置0获得了一个Int32,在位置1获得了一个String。但是在位置2我得到一个空对象。
有谁知道我想做的事情是否可能?我无法控制我正在使用的JSON结构。如果可能的话,我想在不使用第三方程序集的情况下完成此任务。
答案 0 :(得分: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;
答案 1 :(得分:1)
麦克,
问题是在反序列化期间,JSON反序列化器不知道将位置2的元素反序列化为什么类型。
您需要提供“__type”提示。您可以通过在多态情况下将其序列化为JSON,并查看发出的类型提示来获取特定类型的__type提示。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb412170.aspx。请特别注意“分配给对象的集合”和“保留类型信息”部分