Json正确反序列化了密钥,但没有值

时间:2018-07-06 05:36:09

标签: c# json serialization json.net deserialization

我正在尝试将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; }
}

还有另一个类“设置”,其中包含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 :(得分:1)

尝试添加二传手:

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

有关序列化here

的更多信息

它说:

  

在具有Data-MemberAttribute的所有属性上实现getter和setter。数据协定序列化程序要求将类型的getter和setter都视为可序列化的。如果不会部分信任使用该类型,则属性访问者中的一个或两个都可以是非公开的。