将 JSON 从 ASP.net Web 服务反序列化为 C# 对象
本文关键字:反序列化 对象 服务 Web JSON ASP net | 更新日期: 2023-09-27 18:33:16
在这里花了一天时间阅读帖子后,我仍然无法让它工作,所以希望这对这里的人来说是有意义的。
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);
当我使用此模型时,会创建某人,但所有属性均为空
[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 时 可以添加"类型提示",反序列化程序识别提示和 行为得当。"类型提示"是一个 JSON 键/值对,其中 "__type"的键名(两个下划线后跟单词"type"(。 该值是以下形式的 JSON 字符串 "DataContractName:DataContractNamespace"(第一个之前的任何内容( 冒号是名称(。
类型提示与由 XML 架构实例标准,在序列化/反序列化时使用 .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")]
到你的数据合同属性上的人。
[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; }
}