JSON 反序列化键正确,但不是值



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

为了进行测试,我正在读取一个包含名称和单个 IP 的单个 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);

序列化程序是一个类,它定义了 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; }
}

我不知道去哪里看。知道我应该检查代码的哪一部分是否有问题吗?如果问题不清楚或您需要更多信息,请告诉我。谢谢!

尝试添加一个二传手:

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

有关序列化的更多信息,请单击此处

它说:

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

最新更新