Я работаю над приложением 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». Но я не могу изменить ответ сервера, так что я могу сделать? Есть идеи ?
Одним быстрым и грязным решением является замена всех экземпляров «IS_PAID»: «F» на «IS_PAID»: «false». Другим было бы десериализовать в поле строки, называемое isPaidRaw, а затем у вас есть другое свойство с именем IsPaid с булевым типом, в котором вы проверяете isPaidRaw и конвертируете в bool соответственно. –
Я подумал о втором предположении, но я думаю, что это может замедлить производительность и заставить его выглядеть уродливым cz. У меня есть несколько булевых полей, а не только этот, поэтому это означает, что для устранения проблемы требуется множество дополнительных атрибутов –