2013-02-22 63 views
0

我正在處理wp7應用程序,並且我有一個向服務器發送http web請求的函數,服務器返回一個json字符串作爲響應。假設字符串是這樣的:DataContractJsonSerializer解析布爾字符串

{"products" : 
[ 
{"PRODUCT_ID" : "1", "PRODUCT_NAME" : "product1","IS_PAID" : "F"}, 
{"PRODUCT_ID" : "30","PRODUCT_NAME" : "product2","IS_PAID" : "T"}, 
{"PRODUCT_ID" : "36","PRODUCT_NAME" : "product3","IS_PAID" : "F"} 
]} 

和我的產品類別是這樣的:

[DataContract] 
public class Product 
{   
    [DataMember(Name = "PRODUCT_ID")] 
    public long productId { get; set; } 

    [DataMember(Name = "PRODUCT_NAME")] 
    public string productName { get; set; } 

    [DataMember(Name = "IS_PAID")] 
    public bool isPaid { get; set; } 
} 

在我的代碼,當我試圖解析JSON響應:

DataContractJsonSerializer serailizer = new DataContractJsonSerializer(typeof(Product[])); 
MemoryStream reader = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)); 
SynchronizeResponse mResponseObject = (Product[])serailizer.ReadObject(reader); 

我得到一個例外:

有一個錯誤反序列化MyNameSpance.Product類型的對象。 FormatException

經過大量的調試後,我發現問題出在布爾屬性「isPaid」,並且該值必須是「True」或「False」;不是「T」和「F」。但是我無法更改服務器響應,所以我該怎麼辦?有任何想法嗎 ?

+1

一個快速和骯髒的解決辦法是更換「IS_PAID」的所有實例:「F」到「IS_PAID」:「假的」。另一種方法是反序列化爲名爲isPaidRaw的字符串字段,然後您有另一個名爲IsPaid的布爾類型的屬性,其中您檢查isPaidRaw並相應地轉換爲bool。 – 2013-02-22 10:19:28

+0

我想過第二個建議,但我認爲它可能會降低性能,並使其看起來很醜cz我有幾個布爾字段不只是這個,所以這意味着很多額外的屬性來解決這個問題 – 2013-02-22 10:48:52

回答

1

顯然, 「T」 是不是一個bool有效值。

所以,答案是:不要使用 a bool。改用一個字符串。

[DataMember(Name = "IS_PAID")] 
public string isPaidString { get; set; } 

public bool isPaid 
{ 
    get {return isPaidString == "T";} 
    set {isPaidString = value ? "T" : "F";} 
}