Как правильно десериализация 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 шт):

Автор решения: VladD

Предположу, что проблема в определении класса 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));

Документация содержит и другие возможности по настройке, почитайте!

→ Ссылка