#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
}