2013-09-05 76 views
58

我正在開發一個API以使用ASP.NET Web API公開一些數據。使用Json.Net序列化時指定自定義日期時間格式

在其中一個API中,客戶希望我們以yyyy-MM-dd格式公開日期。我不想更改全局設置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter),因爲它對此客戶端非常具體。而且我在一個針對多個客戶的解決方案中進行開發。

一,我能想到的解決方案是創建一個自定義的Json轉換器,然後把那財產,我需要做的自定義格式

例如

class ReturnObjectA 
{ 
    [JsonConverter(typeof(CustomDateTimeConverter))] 
    public DateTime ReturnDate { get;set;} 
} 

只是想知道是否有一些其他簡單的方法來做到這一點。

+8

對於什麼是值得注意的是,API是用於計算機可讀性的,而不是用戶可讀性的,所以最好堅持一個指定的日期格式,例如[ISO 8601](http://xkcd.com/1179/)。如果客戶端直接向用戶顯示API結果,或者爲API編寫他們自己的日期解析代碼,那麼他們做錯了。格式化顯示日期應留給最頂層的UI層。 – MCattle

回答

91

你是在正確的軌道上。既然你說過你不能修改全局設置,那麼下一個最好的事情就是按照你的建議,根據需要應用JsonConverter屬性。原來Json.Net已經有一個內置的IsoDateTimeConverter,可以讓你指定日期格式。不幸的是,你不能通過JsonConverter屬性來設置格式,因爲屬性唯一的參數是一個類型。但是,有一個簡單的解決方案:子類IsoDateTimeConverter,然後在子類的構造函數中指定日期格式。根據需要應用JsonConverter屬性,指定您的自定義轉換器,然後就可以開始了。下面是所需的代碼的全部:

class CustomDateTimeConverter : IsoDateTimeConverter 
{ 
    public CustomDateTimeConverter() 
    { 
     base.DateTimeFormat = "yyyy-MM-dd"; 
    } 
} 

如果你不介意在那裏還的時候,你甚至都不需要繼承IsoDateTimeConverter。其默認日期格式爲yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK(如source code所示)。

+0

@Koen Zomers - 您從我的日期格式中刪除的單引號在技術上是正確的,儘管它們在這裏不是必須的。請參閱[自定義日期和時間格式字符串文檔](http://msdn.microsoft.com/zh-cn/library/8kb3ddd4(v = vs.110).aspx)中的_Literal String Delimiters_。然而,我引用的作爲「IsonDateTimeConverter」默認格式的格式直接來自[Json.Net源代碼](http://json.codeplex.com/SourceControl/latest#trunk/Src/Newtonsoft.Json/轉換器/ IsoDateTimeConverter.cs);因此我正在恢復您的編輯。 –

+0

它沒有在這裏用引號工作,它沒有它們,但如果你說它應該,我可能做錯了什麼。對編輯抱歉。 –

+0

非常感謝你:)輕鬆工作! – Erik

25

它也可以用一個臨時IsoDateTimeConverter實例來完成,而無需改變全局格式設置:

string json = JsonConvert.SerializeObject(yourObject, 
    new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }); 

這使用,需要一個params JsonConverter[]論證過載。

+4

比接受的答案簡單得多 – FastTrack

+0

然而它顯示了一個T,其中空格字符是:( – DARKGuy

+1

如果你在很多地方序列化相同的類對象,那麼接受的答案比這個更好 –

8

也可使用串行設置重載之一:

var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

或者

var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

重載採取型也可提供。

+0

完美和絕妙的把戲 – user6628729

+0

隨意給我只是一個upvote!;) – Matt

+0

僅供參考我想你的意思是'yyyy-MM-ddTHH:mm:ssZ' ..小時。 – Neek

23

你可以使用這種方法:

public class DateFormatConverter : IsoDateTimeConverter 
{ 
    public DateFormatConverter(string format) 
    { 
     DateTimeFormat = format; 
    } 
} 

而且使用這種方式:

class ReturnObjectA 
{ 
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")] 
    public DateTime ReturnDate { get;set;} 
} 

的DateTimeFormat字符串使用這裏所描述的.NET格式字符串語法:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

+0

base.DateTimeFormat = format; – SoliQuiD

+0

這是最好的答案,因爲它易於理解和高度擴展。 –

+1

這對我不起作用 - 我得到''JsonConverterAttribute'不包含一個構造函數,它需要2個參數' –