簡體   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