我有一个JSON字符串,我想反序列化为Compound对象。
JSON
[{
"Name":"Aspirin",
"Identifiers":[{
"__type":"Identifier",
"IdentifierType":0,
"Value":"InChI=1\/C9H8O4\/c1-6(10)13-8-5-3-2-4-7(8)9(11)12\/h2-5H,1H3,(H,11,12)",
"Version":"v1.02b"
},{
"__type":"Identifier",
"IdentifierType":0,
"Value":"InChI=1S\/C9H8O4\/c1-6(10)13-8-5-3-2-4-7(8)9(11)12\/h2-5H,1H3,(H,11,12)",
"Version":"v1.02s"
},{
"__type":"Identifier",
"IdentifierType":2,
"Value":"BSYNRYMUTXBXSQ-UHFFFAOYAW",
"Version":"v1.02b"
},{
"__type":"Identifier",
"IdentifierType":2,
"Value":"BSYNRYMUTXBXSQ-UHFFFAOYSA-N",
"Version":"v1.02s"
},{
"__type":"Identifier",
"IdentifierType":1,
"Value":"CC(=O)Oc1ccccc1C(=O)O",
"Version":"OEChem"
}]
}]
复合类
[KnownType(typeof(List<Identifier>))]
[DataContract]
public class Compound
{
[DataMember]
public string Name { get; set; }
[DataMember]
public List<Identifier> Identifiers { set; get; }
}
标识符类
[DataContract]
public class Identifier
{
[DataMember]
public string Version { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public int IdentifierType { get; set; }
}
反序列化代码
DataContractJsonSerializer ser =
new DataContractJsonSerializer(
typeof(IEnumerable<Compound>),
new Type[] { typeof(List<Identifier>) }
);
IEnumerable<Compound> compounds =
ser.ReadObject(
new MemoryStream(Encoding.UTF8.GetBytes(response))
) as IEnumerable<Compound>;
错误消息
元素':item'包含映射到名称的类型的数据 ':标识符'。反序列化器不知道任何映射类型 这个名字。考虑使用DataContractResolver或添加类型 对应于已知类型列表的“标识符” - 用于 例如,通过使用KnownTypeAttribute属性或将其添加到 传递给DataContractSerializer的已知类型列表。
我做错了什么?
答案 0 :(得分:2)
将空Namespace
添加到用于装饰Identifier
类的DataContract属性中:
[DataContract(Namespace = "")]
public class Identifier
{
[DataMember]
public string Version { get; set; }
[DataMember]
public string Value { get; set; }
[DataMember]
public int IdentifierType { get; set; }
}
您需要这个的原因是因为JSON中使用的__type
属性对序列化程序有特殊意义。
答案 1 :(得分:2)
在处理json时我会使用Json.Net。看看它有多容易..
var jObj = JsonConvert.DeserializeObject <List<Compound>>(response);
public class Compound
{
public string Name { get; set; }
public List<Identifier> Identifiers { set; get; }
}
public class Identifier
{
public string Version { get; set; }
public string Value { get; set; }
public int IdentifierType { get; set; }
}