[英]Json deserializing key correctly but not value
我正在尝试将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);
序列化器是一个类,具有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都视为可序列化的。 如果将不以部分信任的方式使用该类型,则属性访问器中的一个或两个可以是非公共的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.