Как правильно десериализация json файл, для вывода в консоли
public class Track
{
public int Id { get; set; }
public string Name { get; set; }
public Driver driver { get; set; }
public string State { get; set; }
}
public class Driver
{
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
public int Experience { get; set; }
}
Джейсон файл
[
{
"Id": 1,
"Name": "Renault Magnum",
"Driver": {
"Name" : "John",
"Surname" : "Dou",
"Age" : 35,
"Experience" : 10
},
"State": "base"
},
{
"Id": 2,
"Name": "Volvo FH12",
"Driver": {
"Name" : "Jack",
"Surname" : "Dou",
"Age" : 55,
"Experience" : 30
},
"State": "base"
},
{
"Id": 3,
"Name": "DAF XF",
"Driver": {
"Name" : "Jane",
"Surname" : "Dou",
"Age" : 45,
"Experience" : 15
},
"State": "base"
}
]
При попытке десериализовать
Tracks = JsonSerializer.Deserialize<Track[]>(File.ReadAllText(path));
Получаю только массив машин, водителей не пойму, как правильно сделать ? Джейсон изучаю совсем недавно. Застрял на этом моменте.Пытался сделать через объект класса. Может лучше в двумерный массив, и с него сделать новые экземпляры класса?
Ответы (1 шт):
Предположу, что проблема в определении класса Track, конкретно в этой строчке:
public Driver driver { get; set; }
В вашем JSON-файле имя свойства Driver, с прописной буквы, вот десериализатор и не может их сопоставить.
Исправьте указанную строчку на
public Driver Driver { get; set; }
Проверил с System.Text.Json.
Более хитрый JSON.NET умеет сопоставить свойство driver в C# со свойством Driver в JSON, но ваш код явно на System.Text.Json, т. к. десериализация строки в JSON.NET выглядела бы как
Tracks = JsonConvert.DeserializeObject<Track[]>(File.ReadAllText(path));
Как подсказывает @aepot в комментариях, вы можете также настроить поведение десериализатора в System.Text.Json, как описано в документации. Например, вы можете заставить его игнорировать различие между прописными и строчными буквами так
Tracks = JsonSerializer.Deserialize<Track[]>(
File.ReadAllText(path),
new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
или так:
Tracks = JsonSerializer.Deserialize<Track[]>(
File.ReadAllText(path),
JsonSerializerOptions(JsonSerializerDefaults.Web));
Документация содержит и другие возможности по настройке, почитайте!