Web API - JsonConverter - 自定义属性
Posted
技术标签:
【中文标题】Web API - JsonConverter - 自定义属性【英文标题】:Web API - JsonConverter - Custom Attribute 【发布时间】: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
我的问题是如何在使用属性时定义自定义构造函数?
【问题讨论】:
【参考方案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;
注意params
在JsonConverterAttribute
构造函数和你的构造函数中的使用可能会让人认为正确的语法是
[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 - 链接的小提琴显示了使用参数的示例。以上是关于Web API - JsonConverter - 自定义属性的主要内容,如果未能解决你的问题,请参考以下文章
将自定义 JsonConverter 添加到 Web API 会影响传递给自定义验证属性的字符串值
如何调用 JsonConvert.DeserializeObject 并禁用通过 [JsonConverter] 应用于基本类型的 JsonConverter?