Как правильно преобразовать JSON в объект класса C# при десериализации?

Как правильно написать класс для десериализации следующего JSON-формата?

```
{
  "01": {
    "tz": {
      "251713": {
        "24586452": {
          "id": 251713,
          "order": "305510010923",
          "date": "2023-09-01 11:05:51",
          "stock": 3,
          "price_in": 9743,
          "price_out": 12315
        }
      },
      "982446": {
        "24571705": {
          "id": 982446,
          "order": "131210010923",
          "date": "2023-09-01 11:11:16",
          "stock": 1,
          "price_in": 92,
          "price_out": 233
        }
      },
      "65341": {
        "24571705": {
          "id": 65341,
          "order": "131210010923",
          "date": "2023-09-01 11:11:16",
          "stock": 3138,
          "price_in": 1,
          "price_out": 23
        },
        "24588297": {
          "id": 65341,
          "order": "101115010923",
          "date": "2023-09-01 15:14:14",
          "stock": 3114,
          "price_in": 1,
          "price_out": 23
        },
        "24588679": {
          "id": 65341,
          "order": "372817010923",
          "date": "2023-09-01 17:39:55",
          "stock": 3103,
          "price_in": 1,
          "price_out": 23
        },
        "24588836": {
          "id": 65341,
          "order": "145618010923",
          "date": "2023-09-01 18:58:48",
          "stock": 3095,
          "price_in": 1,
          "price_out": 23
        }
      }
    }
  }
}
```

Пробовал вот так, но не работает:

```csharp
public class Root
{
    public Dictionary<string, Tz> Items { get; set; }
}

public class Tz
{
    public Dictionary<string, Order> Orders { get; set; }
}

public class Order
{
    public Dictionary<string, Product> Products { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string OrderNumber { get; set; }
    public string Date { get; set; }
    public int Stock { get; set; }
    public int PriceIn { get; set; }
    public int PriceOut { get; set; }
}
```
  • 26 октября 2023 г. 11:30
Ответы на вопрос 2
Для десериализации данного JSON-формата в объект класса C# можно воспользоваться библиотекой Newtonsoft.Json. 

Приведенный вами класс `Root` является основным классом, который содержит в себе все остальные классы. Однако, для правильного преобразования JSON необходимо внести некоторые изменения в структуру классов.

Вот как должен выглядеть класс для десериализации данного JSON-формата:

```csharp
public class Root
{
    public Dictionary<string, Tz> Items { get; set; }
}

public class Tz
{
    public Dictionary<string, Order> tz { get; set; }
}

public class Order
{
    public Dictionary<string, Product> Products { get; set; }
}

public class Product
{
    public int id { get; set; }
    public string order { get; set; }
    public string date { get; set; }
    public int stock { get; set; }
    public int price_in { get; set; }
    public int price_out { get; set; }
}
```

В данной структуре классов внесены изменения в имена свойств, чтобы они соответствовали именам в JSON-формате. 

Теперь вы можете преобразовать JSON в объект класса C# следующим образом:

```csharp
string json = @"{
  ""01"": {
    ""tz"": {
      ""251713"": {
        ""24586452"": {
          ""id"": 251713,
          ""order"": ""305510010923"",
          ""date"": ""2023-09-01 11:05:51"",
          ""stock"": 3,
          ""price_in"": 9743,
          ""price_out"": 12315
        }
      },
      ""982446"": {
        ""24571705"": {
          ""id"": 982446,
          ""order"": ""131210010923"",
          ""date"": ""2023-09-01 11:11:16"",
          ""stock"": 1,
          ""price_in"": 92,
          ""price_out"": 233
        }
      },
      ""65341"": {
        ""24571705"": {
          ""id"": 65341,
          ""order"": ""131210010923"",
          ""date"": ""2023-09-01 11:11:16"",
          ""stock"": 3138,
          ""price_in"": 1,
          ""price_out"": 23
        },
        ""24588297"": {
          ""id"": 65341,
          ""order"": ""101115010923"",
          ""date"": ""2023-09-01 15:14:14"",
          ""stock"": 3114,
          ""price_in"": 1,
          ""price_out"": 23
        },
        ""24588679"": {
          ""id"": 65341,
          ""order"": ""372817010923"",
          ""date"": ""2023-09-01 17:39:55"",
          ""stock"": 3103,
          ""price_in"": 1,
          ""price_out"": 23
        },
        ""24588836"": {
          ""id"": 65341,
          ""order"": ""145618010923"",
          ""date"": ""2023-09-01 18:58:48"",
          ""stock"": 3095,
          ""price_in"": 1,
          ""price_out"": 23
        }
      }
    }
  }
}";

Root root = JsonConvert.DeserializeObject<Root>(json);
```

После выполнения этого кода переменная `root` будет содержать объекты классов, соответствующие структуре JSON-формата. Вы можете использовать эти объекты для работы с данными из JSON.
1. Для десериализации сложных структур данных, состоящих из вложенных словарей, можно использовать следующий пример:

```csharp
Dictionary>>> items;
```

2. Если вы хотите использовать наследование для работы со словарями, можете попробовать следующий подход:

```csharp
class MyDictionary : Dictionary { }
```

В этом случае вы можете использовать класс MyDictionary вместо стандартного Dictionary для создания вложенных словарей:

```csharp
MyDictionary>>> items;
```

Примечание: в обоих случаях я использовал тип Product для примера, вы можете заменить его на нужный вам тип данных.
Похожие вопросы