Saya mengembangkan API untuk mengekspos beberapa data menggunakan ASP.NET Web API.
Di salah satu API, klien ingin kami menampilkan tanggal dalam yyyy-MM-dd
format. Saya tidak ingin mengubah pengaturan global (misalnya GlobalConfiguration.Configuration.Formatters.JsonFormatter
) untuk itu karena sangat spesifik untuk klien ini. Dan saya mengembangkannya dalam solusi untuk banyak klien.
Salah satu solusi yang dapat saya pikirkan adalah membuat kustom JsonConverter
dan kemudian memasukkannya ke properti yang saya perlukan untuk melakukan pemformatan kustom.
misalnya
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Hanya ingin tahu apakah ada cara mudah lain untuk melakukan itu.
c#
datetime
asp.net-web-api
json.net
Tetap Bodoh
sumber
sumber
Jawaban:
Anda berada di jalur yang benar. Karena Anda mengatakan Anda tidak dapat mengubah pengaturan global, maka hal terbaik berikutnya adalah menerapkan
JsonConverter
atribut sesuai kebutuhan, seperti yang Anda sarankan. Ternyata Json.Net sudah memiliki built-inIsoDateTimeConverter
yang memungkinkan Anda menentukan format tanggal. Sayangnya, Anda tidak dapat menyetel format melaluiJsonConverter
atribut, karena satu-satunya argumen atribut adalah tipe. Namun, ada solusi sederhana: subclass theIsoDateTimeConverter
, lalu tentukan format tanggal di konstruktor subclass tersebut. TerapkanJsonConverter
atribut jika diperlukan, tentukan konverter khusus Anda, dan Anda siap untuk pergi. Berikut ini keseluruhan kode yang dibutuhkan:class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-dd"; } }
Jika Anda tidak keberatan memiliki waktu di sana juga, Anda bahkan tidak perlu membuat subclass IsoDateTimeConverter. Format tanggal defaultnya adalah
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(seperti yang terlihat di kode sumber ).sumber
IsonDateTimeConverter
diambil langsung dari kode sumber Json.Net ; oleh karena itu saya mengembalikan hasil edit Anda tentang itu.Anda bisa menggunakan pendekatan ini:
public class DateFormatConverter : IsoDateTimeConverter { public DateFormatConverter(string format) { DateTimeFormat = format; } }
Dan gunakan dengan cara ini:
class ReturnObjectA { [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")] public DateTime ReturnDate { get;set;} }
String DateTimeFormat menggunakan sintaks string format .NET yang dijelaskan di sini: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
sumber
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
:, artinya versi json.net Anda terlalu lama. Anda perlu memperbarui ke versi json.net terbaru.Itu juga dapat dilakukan dengan sebuah
IsoDateTimeConverter
instance, tanpa mengubah pengaturan pemformatan global:string json = JsonConvert.SerializeObject(yourObject, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
Ini menggunakan
JsonConvert.SerializeObject
kelebihan beban yang membutuhkanparams JsonConverter[]
argumen.sumber
Juga tersedia menggunakan salah satu kelebihan pengaturan serializer:
var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });
Atau
var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });
Overload mengambil Type juga tersedia.
sumber
yyyy-MM-ddTHH:mm:ssZ
.. 24 jam setiap jam.Buat kelas pembantu dan terapkan ke atribut properti Anda
Kelas pembantu:
public class ESDateTimeConverter : IsoDateTimeConverter { public ESDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ"; } }
Kode Anda menggunakan seperti ini:
[JsonConverter(typeof(ESDateTimeConverter))] public DateTime timestamp { get; set; }
sumber
Ada solusi lain yang telah saya gunakan. Buat saja properti string dan gunakan untuk json. Properti ini akan mengembalikan tanggal diformat dengan benar.
class JSonModel { ... [JsonIgnore] public DateTime MyDate { get; set; } [JsonProperty("date")] public string CustomDate { get { return MyDate.ToString("DDMMYY"); } set { MyDate = DateTime.Parse(value); } } ... }
Dengan cara ini Anda tidak perlu membuat kelas tambahan. Selain itu, ini memungkinkan Anda membuat format data yang berbeda. misalnya, Anda dapat dengan mudah membuat Properti lain untuk Jam menggunakan DateTime yang sama.
sumber
Beberapa kali mendekorasi atribut json convert tidak akan berfungsi, itu akan melalui pengecualian yang mengatakan bahwa " 2010-10-01" adalah tanggal yang valid . Untuk menghindari tipe ini saya menghapus atribut convert json pada properti dan disebutkan dalam metode deserilizedObject seperti di bawah ini.
var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
sumber
Dengan konverter di bawah ini
public class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd"; } public CustomDateTimeConverter(string format) { DateTimeFormat = format; } }
Dapat menggunakannya dengan format kustom default
class ReturnObjectA { [JsonConverter(typeof(DateFormatConverter))] public DateTime ReturnDate { get;set;} }
Atau format tertentu untuk sebuah properti
class ReturnObjectB { [JsonConverter(typeof(DateFormatConverter), "dd MMM yy")] public DateTime ReturnDate { get;set;} }
sumber