2013-02-22 58 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";} 
}