我正在使用的产品中的一个对象有一个“特性”列表,该列表至少有一个共同的属性,即“名称”,但是这些属性可以有很大的不同。一个简单而有效的方法是将所有的可能性都放入一个要素类中,如果它没有值,则允许属性为空,但这似乎不是正确的方法,因为当它被去序列化时,控制台中的结果是许多空属性。我想做的是有一个基本的“功能”类,然后为每个单独的功能派生类,但我不知道如何去序列化它,或者如果这是可能的。我看了有条件的财产序列化,但它似乎不是我所追求的。
这里有一个Json和类的例子,我想反序列化,并有能力再次序列化。我将感谢任何人对此提供的任何意见。
JSON文件
"features": [{
"name": "dhcp",
"enabled": true,
"version": 1,
"ipPool": "192.168.0.1-192.168.1.254"
}, {
"name": "interface",
"enabled": true,
"ifName": "Test",
"ifType": "physical",
"ipAddress": "10.0.0.1"
}, {
"name": "firewall",
"version": 10,
"rules": [{
"source": "Dave's-PC",
"destination": "any",
"port": 80,
"allow": false
}, {
"source": "Dave's-PC",
"destination": "all-internal",
"port": 25,
"allow": true
}]
}]
类别
namespace Test
{
public class Features
{
[JsonProperty("features", NullValueHandling = NullValueHandling.Ignore)]
public List<Feature> FeatureList { get; set; }
}
public abstract class Feature
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("version", NullValueHandling = NullValueHandling.Ignore)]
public long? Version { get; set; }
[JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)]
public bool? Enabled { get; set; }
}
public class Dhcp : Feature
{
[JsonProperty("ipPool")]
public string IPPool { get; set; }
}
public class Interface : Feature
{
[JsonProperty("ifName")]
public string InterfaceName { get; set; }
[JsonProperty("ifType")]
[JsonConverter(typeof(InterfaceTypeConverter))] // I have an enum and converter class elsewhere for this.
public InterfaceType InterfaceType { get; set; }
[JsonProperty("ipAddress")]
[JsonConverter(typeof(IPAddressConverter))] // I have an enum and converter class elsewhere for this.
public IPAddress IP { get; set; }
}
public class Firewall : Feature
{
[JsonProperty("rules", NullValueHandling = NullValueHandling.Ignore)]
public List<Rule> Rules {get; set; }
}
public class Rule
{
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("destination")]
public string Destination { get; set; }
[JsonProperty("port")]
public long Port { get; set; }
[JsonProperty("allow")]
public bool Allowed { get; set; }
}
}
最终目标是我只需要反序列化对象中每个功能的内容,并且,如果我想创建一个新功能,我将拥有一个派生类,该类仅包含该功能需要添加到 List 的内容
您必须编写一个自定义转换器来处理这个问题。我相信,这是一个类似的问题,涵盖了您的用例。