2013-02-22 2 views
0

Я работаю над приложением wp7, и у меня есть функция, которая отправляет HTTP-запрос на сервер, и сервер возвращает json-строку в качестве ответа. Предположим, что строка выглядит так:DataContractJsonSerializer parse boolean string

{"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»: «false». Другим было бы десериализовать в поле строки, называемое isPaidRaw, а затем у вас есть другое свойство с именем IsPaid с булевым типом, в котором вы проверяете isPaidRaw и конвертируете в bool соответственно. –

+0

Я подумал о втором предположении, но я думаю, что это может замедлить производительность и заставить его выглядеть уродливым cz. У меня есть несколько булевых полей, а не только этот, поэтому это означает, что для устранения проблемы требуется множество дополнительных атрибутов –

ответ

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";} 
} 
0

Вы shsould рассмотреть вопрос об использовании Json.NET