提问者:小点点

我可以根据特定的属性将项目去序列化到不同的派生类中吗?c# Json.Net[重复]


我正在使用的产品中的一个对象有一个“特性”列表,该列表至少有一个共同的属性,即“名称”,但是这些属性可以有很大的不同。一个简单而有效的方法是将所有的可能性都放入一个要素类中,如果它没有值,则允许属性为空,但这似乎不是正确的方法,因为当它被去序列化时,控制台中的结果是许多空属性。我想做的是有一个基本的“功能”类,然后为每个单独的功能派生类,但我不知道如何去序列化它,或者如果这是可能的。我看了有条件的财产序列化,但它似乎不是我所追求的。

这里有一个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 的内容


共1个答案

匿名用户

您必须编写一个自定义转换器来处理这个问题。我相信,这是一个类似的问题,涵盖了您的用例。