0

在花了一天时间阅读这里的帖子后,我仍然无法让它工作,所以希望这对这里的人有意义。

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

有什么想法吗?谢谢

4

2 回答 2

1

__Type 永远不应成为您的对象的一部分。这是对序列化程序的提示。此外,您在 JSON 对象中的类型提示很糟糕。独立的 JSON 序列化说:

为了保留类型标识,在将复杂类型序列化为 JSON 时,可以添加“类型提示”,并且反序列化器会识别该提示并采取适当的行动。“类型提示”是一个 JSON 键/值对,键名为“__type”(两个下划线后跟单词“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; }
    }
}
于 2012-05-03T15:34:03.893 回答
0

尝试添加(我在这里有点刺痛,所以确切的命名空间我不正确)

[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; }
}
于 2012-05-03T15:33:26.097 回答