【问题标题】:Web API - JsonConverter - Custom AttributeWeb API - JsonConverter - 自定义属性
【发布时间】:2017-09-08 15:21:08
【问题描述】:

我们有一个 web api 项目,为了将日期时间转换为日期,反之亦然,我们使用从 JsonConverter 扩展的 DateTimeconverter。 我们以属性的形式为所有必需的 DateTime 属性使用它(如下所示):

[JsonConverter(typeof(CustomDateConverter))]

CustomDateConverter 如下:

public class CustomDateConverter: JsonConverter
{
    private string[] formats = new string[] { "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy", "dd-MMM-yy" };

    public CustomDateConverter(params string[] dateFormats)
    {
        this.formats = dateFormats;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // custom code
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // custom code
    }
}

我的问题是如何在使用属性时定义自定义构造函数?

【问题讨论】:

    标签: asp.net-web-api json.net asp.net-web-api2 jsonserializer


    【解决方案1】:

    CustomDateConverter 由 Json.NET 构造时,您可以使用 [JsonConverterAttribute(Type,Object[])] 属性构造函数将参数传递给您的 CustomDateConverter。此构造函数自动设置ConverterParameters 属性:

    public class RootObject
    {
        [JsonConverter(typeof(CustomDateConverter), new object [] { new string [] { "dd-MMM-yy", "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy" } } )]
        public DateTime DateTime { get; set; }
    }
    

    注意paramsJsonConverterAttribute 构造函数和你的构造函数中的使用可能会让人认为正确的语法是

    [JsonConverter(typeof(CustomDateConverter), new object [] { "dd-MMM-yy", "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy" } )]
    

    但是,这不起作用。 Json.NET 通过Type.GetConstructor(Type []) 查找具有适当签名的构造函数 - 构造函数的反射签名显示一个参数,即字符串数组。

    fiddle.

    【讨论】:

    • 如果您展示如何在自定义 convertrt 中读取参数,将会非常有帮助
    • @kofifus - 链接的小提琴显示了使用参数的示例。
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2020-08-07
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多