2010-10-11 101 views
2

我无法使用DataContractJsonSerializer类反序列化混合类型的JSON数组。我花了很多时间寻找解决方案,但我想我会继续在这里问。反序列化混合类型的JSON数组

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

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

如果我只是创建像这样一个连载:但是在位置2的位置是1

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

我实际上是在位置0获得一个Int32和字符串我只是得到一个空对象。

有谁知道我想要做甚么可能吗?我无法控制我正在使用的JSON的结构。如果可能,我希望在不使用第三方程序集的情况下完成此操作。

回答

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”和“数据成员”属性。然后在你的反序列化的代码使用您在下面的例子中

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; 
+0

这也是最初想到的。问题是像这样的数组不会反序列化到一个类。序列化程序强制将其反序列化为数组。当我尝试这个时,我得到错误“期待状态'元素'..遇到'文本'的名称'',命名空间''。” – Mike 2010-10-11 00:55:35

+0

请看看我最后的编辑。我忘了它是一组元素...... – Lorenzo 2010-10-11 00:58:32

+0

洛伦佐,感谢代码示例。这似乎也不管用。这将生成一个int成员= 0的MyClass实例,其他两个成员为null。东西仍然缺失... – Mike 2010-10-11 03:12:38

1

麦克创建的类,

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

您需要提供一个“__type”提示。你可以通过在一个多态的情况下将它序列化为JSON来获得特定类型的__type提示,并查看发出了什么类型的提示。

欲了解更多信息,请参阅http://msdn.microsoft.com/en-us/library/bb412170.aspx。要特别注意“分配给对象的集合”和“保存类型信息”部分