在C#中覆盖基类的Json.NET注释

时间:2018-04-22 07:09:15

标签: c# .net annotations json.net

我正在使用公开的库公开SwaggerDocument的模型。它附带了一些通过注释添加的序列化逻辑,以指定在序列化期间应该忽略的内容,以及在序列化和反序列化期间应该应用的顺序:

    [Newtonsoft.Json.JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 6, PropertyName = "basePath")]
public string BasePath;

我想更改这些注释,而不必创建我自己的类,并复制所有其他逻辑。我可以扩展此类并覆盖注释吗? E.g。

MySwaggerDocument: SwaggerDocument 
{
    @override
    [Newtonsoft.Json.JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate, Order = 4, PropertyName = "basePath")]
    public string BasePath;
}

1 个答案:

答案 0 :(得分:1)

这不是一个理想的解决方案,虽然这有效。

您可以使用以下策略来公开基类的一些属性,这些属性会破坏自定义派生类中的顺序。

缺点是声明一些基类的属性,但正如您所看到的,这背后的逻辑很简单(get / set语法是C#7.0)。

using Newtonsoft.Json;
using System;

namespace JsonTest
{
    public class Base
    {
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 1, PropertyName = "A")]
        public string A { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 2, PropertyName = "X")]
        public string X { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 3, PropertyName = "B")]
        public string B { get; set; }
    }

    public class Derived : Base
    {
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 4, PropertyName = "C")]
        public string C { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 5, PropertyName = "X")]
        public new string X
        {
            get => base.X;
            set => base.X = value;
        }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 6, PropertyName = "D")]
        public string D { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base b = new Base() { A = "a", B = "b", X = "x" };
            string serB = JsonConvert.SerializeObject(b);
            Console.WriteLine($"Serialized base class:\r\n {serB}");

            Derived d = new Derived() { A = "a", B = "b", C = "c", D = "d", X = "x" };
            string serD = JsonConvert.SerializeObject(d);
            Console.WriteLine($"Serialized derived class:\r\n {serD}");
        }
    }
}

输出:

Serialized base class:
 {"A":"a","X":"x","B":"b"}
Serialized derived class:
 {"A":"a","B":"b","C":"c","X":"x","D":"d"}