[英]Deserializing JSON from ASP.net web service into C# object
花了一天的时间阅读这里的帖子后,我仍然无法使它正常工作,因此希望对这里的某人有意义。
Web服务返回此简单的JSON
{"d":{"__type":"TestWebServices.Person","Name":"Bob","FavoriteColor":"Green","ID":0}}
然后我正在使用C#代码反序列化
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));
Person someone = (Person)jsonSerializer.ReadObject(responseStream);
当我使用此模型时,会创建一个人,但所有属性均为null
[DataContract]
public class Person {
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
我尝试更加文字化并使用了该模型
[DataContract]
public class Person {
[DataMember]
public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
[DataMember]
public string __Type { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
并得到了这个错误,我什至不知道从哪里开始
元素“:d”包含来自映射到名称“:GEMiniWebServices.Person”的类型的数据。 解串器不知道任何映射到该名称的类型。 考虑使用DataContractResolver或将与“ TestWebServices.Person”相对应的类型添加到已知类型的列表中-例如,通过使用KnownTypeAttribute属性或将其添加到传递给DataContractSerializer的已知类型的列表中。
有什么想法吗? 谢谢
__Type绝对不能成为对象的一部分。 这是对序列化程序的提示。 而且,您在JSON对象中拥有的类型提示是错误的。 独立JSON序列化表示:
为了保留类型标识,当将复杂类型序列化为JSON时,可以添加“类型提示”,并且反序列化器会识别该提示并采取适当的措施。 “类型提示”是密钥名称为“ __type”的JSON键/值对(两个下划线,后跟单词“ type”)。 该值是形式为“ DataContractName:DataContractNamespace”的JSON字符串(名称中最多第一个冒号)。
类型提示与XML Schema Instance标准定义的xsi:type属性非常相似,并在序列化/反序列化XML时使用。
由于与类型提示的潜在冲突,因此禁止使用名为“ __type”的数据成员。
如果将__type
声明重写为Person:#TestWebServices
或将其消除,则它可与以下代码一起使用:
namespace TestWebServices
{
[KnownType(typeof(Person))]
[DataContract]
public class PersonWrapper
{
[DataMember]
public Person d { get; set; }
}
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
}
尝试添加(我在这里有点刺破,所以确切的名称空间可能是错误的)
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/TestWebServices.Person")]
到您在Person上的DataContractAttribute。
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/TestWebServices.Person")]
public class Person {
[DataMember]
public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
[DataMember]
public string __Type { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.