2017-04-12 105 views
2

我們有一個web api項目,並將日期時間轉換爲日期,反之亦然,我們使用從JsonConverter擴展的DateTimeconverter。 我們在所有所需的日期時間屬性的屬性的形式使用該(如下所示):Web API - JsonConverter - 自定義屬性

[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 
    } 
} 

我的問題是如何可以定義一個自定義的構造函數,而使用屬性?

回答

2

當由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; } 
} 

注意的是,在JsonConverterAttribute構造並在構造函數中使用的params可能會導致人們認爲正確的語法是

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

然而,這將不行。 Json.NET通過Type.GetConstructor(Type [])尋找一個具有適當簽名的構造函數 - 而你的構造函數的反射簽名顯示了一個參數,即一個字符串數組。

fiddle