Система.Текст.Json не может десериализовать объект с помощью массива объектов?

#c# #json #.net #deserialization #system.text.json

Вопрос:

У меня есть структура json, которая выглядит следующим образом:

 {
"SystemType": "SingleDevice",
"Devices":
[
    {
    "DeviceSettings":{
        "DeviceType": "Blah",
        "Generates": 4,
        "RAdd": 10,
        "TAdd": 10,
        "Distance": 1,
        "IpAddress": "192.168.0.21",
        "Port": 50002 
        }
    }
]}
 

Затем у меня есть два класса, которые выглядят следующим образом:

DeviceSettings.cs

 public class DeviceSettings
{
    public string DeviceType { get; set; }
    public int Generates { get; set; }
    public double RAdd{ get; set; }
    public double TAdd { get; set; }
    public double Distance { get; set; }
    public string IpAddress { get; set; }
    public int Port { get; set; }
}
 

SystemSettings.cs

   public class SystemSettings
{
    public string SystemType { get; set; }
    public DeviceSettings[] Devices { get; set; }
}
 

Когда я отлаживаю следующий код и смотрю на локальные объекты, возвращаемый результирующий объект существует, но с некоторыми проблемами. Тип системы правильно отображает «SingleDevice», а Устройства указывают, что это массив размером=1, и содержит элемент 0, но когда я смотрю фактические значения для всего, они либо равны нулю, либо 0. В частности, тип устройства и IP-адрес = null, все остальное равно 0. Может ли кто-нибудь объяснить, почему и как это обойти?

         static void Main(string[] args)
    {
        var configFilePath = @"C:UsersPublicDocumentsmyFolderSystemConfiguration.json";
        var config = System.IO.File.ReadAllText(configFilePath);
        Console.WriteLine(config);
        var systemSettings = JsonSerializer.Deserialize<SystemSettings>(config);
        Console.ReadKey();
    }
 

выход местных жителей

Я видел сообщения, в которых говорилось о предполагаемых типах, но я считаю, что здесь все ясно. Я не совсем понимаю, что происходит.

Комментарии:

1. Но Devices свойство в JSON-это не список DeviceSettings объектов. Это список объектов определенного типа , обладающих DeviceSettings свойством. Вам нужен объект между ними.

2. Если вы не знаете, как создавать классы C# на основе существующей строки JSON, вы можете использовать такие инструменты, как json2csharp или встроенная специальная функция вставки Visual Studios, которая создаст классы для вас.

Ответ №1:

Вам не хватает объекта для хранения DeviceSettings собственности:

 public class SystemSettings
{
    public string SystemType { get; set; }
    public Device[] Devices { get; set; } // <-- change this
}

// Add this
public class Device
{
    public DeviceSettings DeviceSettings { get; set; }

}

public class DeviceSettings
{
    //snip
}