JSON десериализует ключ правильно, но не значение - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь десериализовать строку 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; }
}

Я не уверен, где искать. Любая идея, какую часть кода я должен проверить на наличие проблем? Пожалуйста, дайте мне знать, если проблема не ясна или вам нужна дополнительная информация. Спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Попробуйте добавить сеттер:

public List<string> Ips { get; set;}

Подробнее о сериализации здесь

Там написано:

Реализуйте метод получения и установки для всех свойств, имеющих Data-MemberAttribute. Сериализаторы контракта данных требуют, чтобы и получатель и установщик для типа считались сериализуемыми. Если тип не будет использоваться при частичном доверии, один или оба средства доступа к свойству могут быть непубличными.

...