将 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 的已知类型列表中。

有什么想法吗?谢谢

将 JSON 从 ASP.net Web 服务反序列化为 C# 对象

__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; }
}