Вспоминаем материалы лекции про типы данных
Подгатавливаем файл с исходными данными:
[
{
"age": 1,
"breed": "Дворняжка",
"color": "Белый",
"name": "Ириска",
"dateOfLastVaccination": null
},
{
"age": 2,
"breed": "Шотландская вислоухая",
"color": "Коричневый",
"name": "Изи",
"dateOfLastVaccination": "2020-01-31"
},
{
"age": 3,
"breed": "Сиамский",
"color": "Цветной",
"name": "Макс",
"dateOfLastVaccination": "2022-05-10"
},
]
[]
- квадратные скобки означают, что у нас массив{}
- в фигурных скобках записана информация об объекте\"
Импорт данных
Для поддержки работы десериализатора и для обхода проблемы с датой в виде строки будем использовать первый вариант десериализатора.
Добавляем в класс аттрибуты [DataContract] и [DataMember]:
[DataContract]
public class Cat
{
[DataMember]
public string name { get; set; }
[DataMember]
public int age{ get; set; }
[DataMember]
public string color { get; set; }
[DataMember]
public string breed { get; set; }
[DataMember]
public string photo { get; set; }
[DataMember(Name = "dateOfLastVaccination")]
private string? stringDate { get; set; }
[IgnoreDataMember]
public DateTime? dateOfLastVaccination {
get
{
return stringDate == null ? null : DateTime.Parse(stringDate);
}
set
{
stringDate = value.ToString();
}
}
}
И реализуем класс JSONDataProvider:
public class JSONDataProvider
{
private List<Cat> _catList;
public JSONDataProvider()
{
var serializer = new DataContractJsonSerializer(typeof(Cat[]));
using (var sr = new StreamReader("/home/kei/temp/test.json"))
{
_catList = ((Cat[])serializer.ReadObject(sr.BaseStream)).ToList();
}
}
public IEnumerable<Cat> getCats()
{
return _catList;
}
}
В классе окна меняем поставщика данных
Подготовить набор данных (не менее 10 записей) с разными типами (обязательно должны быть: Int, Double, String, DateTime, Boolean)
Реализовать класс JSONDataProvider для своей предметной области
Поле с датой добавить в таблицу и указать формат вывода: Binding="{Binding dateOfLastVaccination,StringFormat='dd.MM.yyyy'}"
Если вдруг нам приспичит делать десериализацию используя компонент Newtonsoft.Json, то для обхода проблемы со строковой датой можно реализовать класс-наследник CatWithStringDates, в котором перегрузить поле dateOfLastVaccination:
public class CatWithStringDates: Cat { public string dateOfLastVaccination { get; set; } }
И при десериализации использовать этот класс:
var catList = JsonConvert.DeserializeObject<CatWithStringDates[]>("[{\"age\": 1, \"dateOfLastVaccination\": \"2020-01-01\"}]");
Затем, используя LINQ запрос преобразовать к нужному типу:
_catList = catList.Select(cat => new Cat { age = cat.age, dateOfLastVaccination = DateTime.Parse(cat.dateOfLastVaccination) }).ToList();