Я пытаюсь десериализовать строку JSON в объект. Ниже приведен класс имен сетевых интерфейсов и список сопоставлений IP-адресов:
[DataContract]
public class NicMappings
{
public NicMappings()
{
this.Ips = new List<IPAddress>();
}
[DataMember]
public string NetworkInterfaceName { get; set; }
[DataMember]
public List<IPAddress> Ips { get; }
}
Существует еще один класс Settings, который содержит список NicMappings:
[DataContract]
public class Settings
{
public Settings()
{
this.PrivateIps = new List<IPAddress>();
this.VirtualIps = new List<IPAddress>();
this.IpRanges = new List<IPPrefix>();
this.NicMappings = new List<NicMappings>();
}
[DataMember]
public List<IPAddress> PrivateIps { get; private set; }
[DataMember]
public List<IPAddress> VirtualIps { get; private set; }
[DataMember]
public List<IPPrefix> IpRanges { get; private set; }
[DataMember]
public List<NicMappings> NicMappingsList { get; private set; }
}
Для тестирования я читаю один NicMapping, содержащий имя и один IP, который отлично сериализуется (вместе с другими членами класса Settings). Это вывод JSON:
{"PrivateIps":["10.0.0.1","10.0.0.2","10.0.0.3"],..."NicMappings":[{"NetworkInterfaceName":"Nic","Ips":["127.0.0.1"]}]}
Десериализация - это проблема. Все остальные настройки отлично десериализованы, кроме NicMappings. Он десериализует имя отлично, но не десериализует Ips. Это даже не исключение. Я добавил журнал в оператор для проверки количества Ips, он печатает 0. Это код, который я использую для десериализации:
Settings settings = Serializer.GetSettings<Settings>(file);
Serializer - это класс, в котором есть объект JsonSerializerSettings со связывателем и определены некоторые преобразователи.
public T GetSettings(string file)
{
string json = File.ReadAllText(file);
return Deserialize<T>(json);
}
Далее
List<NicData> nicData = GetNicData(settings.NicMappingsList);
private List<NicData> GetNicData(List<NicMappings> NicMappingsList)
{
List<NicData> NicDatas = new List<NicData>();
foreach (NicMappings nicMapping in NicMappingsList)
{
NicData nicData = new NicData
{
NetworkInterfaceName = nicMapping.NetworkInterfaceName
};
foreach (IPAddress ipAddress in nicMapping.Ips)
{
nicData.Ips.Add(ipAddress.ToString());
}
nicDataList.Add(NicData);
}
return nicDataList;
}
Вышеприведенное возвращает мне список с одним элементом, с правильным именем, но с пустым списком Ips.
Кстати, NicData - это почти то же самое, что NicMappings
public class NicData
{
public NicData()
{
Ips = new List<string>();
}
public string NetworkInterfaceName { get; set; }
public List<string> Ips { get; }
}
Я не уверен, где искать. Любая идея, какую часть кода я должен проверить на наличие проблем? Пожалуйста, дайте мне знать, если проблема не ясна или вам нужна дополнительная информация. Спасибо!