2009-11-18 17 views
4

我想反序列化從谷歌API的JSON響應,所以我想我會確定了幾個班,以幫助它:爲什麼我使用KnownType屬性是錯誤的?

[DataContract] 
public class DetectionResult:ResponseData 
{ 
    [DataMember(Name="language")] 
    public string Language 
    { get; set; } 

    [DataMember(Name="isReliable")] 
    public bool IsReliable 
    { get; set; } 

    [DataMember(Name="confidence")] 
    public double Confidence 
    {get;set;} 
} 

[DataContract] 
public abstract class ResponseData 
{ 

    [DataMember(Name = "error")] 
    public TranslationError Error 
    { get; set; } 

} 

[DataContract] 
public class TranslationError 
{ 
    [DataMember(Name="code")] 
    public int Code 
    { get; set; } 

    [DataMember(Name="message")] 
    public int Message 
    { get; set; } 
} 


[DataContract] 
[KnownType(typeof(DetectionResult))] 
public class RequestResult 
{ 
    [DataMember(Name="responseStatus")] 
    public int ResponseStatus 
    { get; set; } 

    [DataMember(Name="responseDetails")] 
    public string ResponseDetails 
    { get; set; } 

    [DataMember(Name = "responseData")] 
    public ResponseData Response 
    { get; set; } 
} 

發出請求後,我得到的迴應是:

{"responseData": {"language":"en","isReliable":false,"confidence":0.114892714}, "responseDetails": null, "responseStatus": 200} 

,並使用此代碼反序列化:

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (Stream stream = response.GetResponseStream()) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RequestResult)); 

      RequestResult result = (RequestResult)serializer.ReadObject(stream);     

      stream.Close(); 
     } 

,但我得到一個例外,指出「不能創建一個抽象類」。不知道有關DetectionResult類並正確地反序列化它?

回答

11

在您迴應數據沒有辦法來推斷的具體類型。反序列未指定反序列化的類型。

從MSDN:

爲了保持型同一性,序列複雜類型到JSON一個 「型暗示」時,可以添加,並且解串器識別的提示和 行爲適當。 「類型提示」是一個JSON鍵/值對,鍵名爲「__type」(兩個下劃線後跟單詞「type」)。 該值是一個形式爲 「DataContractName:DataContractNamespace」的JSON字符串(任何內容都不得超過第一個 冒號)。使用前面的例子,「Circle」可以是 ,序列化如下。

http://msdn.microsoft.com/en-us/library/bb412170.aspx

請參閱相關的多態性的部分。

+0

真棒鏈接!非常感謝你找到它。 –

1

你有沒有嘗試把KnownType屬性放在ResponseData而不是RequestResult上?

1

在該代碼示例中,您需要[KnownType(typeof(DetectionResult))]作爲ResponseData的屬性而不是RequestResult。

我不知道這是否足以解決你的問題

+1

我也嘗試過,並且我得到相同的異常。 –

0

根據我使用DataContractSerializer和XmlSerializer的經驗,當在序列化過程中遇到意外的類型時,這些序列化程序會引發異常;他們不會盡其所能。也許DataContractJsonSerializer完全不支持KnownTypes。

相關問題