繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM