使用Json.Net以dd / mm / yyyy格式反序列化日期

我正在尝试将对象从JSON数据反序列化为C#类(我使用的是Newtonsoft Json.NET):数据包含字符串值中的日期,如09/12/2013格式为dd/mm/yyyy

如果我调用JsonConvert.DeserializeObject(data); 日期加载到C#类的日期时间属性,如mm/dd/yyyy ,然后日期值是2013年9月12日(而不是2013年12月9日)。

是否可以配置JsonConvert以正确的格式获取日期?

您可以使用IsoDateTimeConverter并指定DateTimeFormat以获得所需的结果,例如:

 MyObject obj = JsonConvert.DeserializeObject(jsonString, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }); 

演示:

 class Program { static void Main(string[] args) { string json = @"{ ""Date"" : ""09/12/2013"" }"; MyObject obj = JsonConvert.DeserializeObject(json, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }); DateTime date = obj.Date; Console.WriteLine("day = " + date.Day); Console.WriteLine("month = " + date.Month); Console.WriteLine("year = " + date.Year); } } class MyObject { public DateTime Date { get; set; } } 

输出:

 day = 9 month = 12 year = 2013 
 using Newtonsoft.Json; using Newtonsoft.Json.Converters; var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }; myObject obj = JsonConvert.DeserializeObject(myJSONString, dateTimeConverter); 

您也可以在JsonSerializer中配置它:

 var serializer = new JsonSerializer { DateFormatString = "dd/MM/yyyy" }; 

在WebConfig中添加文化:

    

然后在WebApiConfig.cs文件中添加下面的代码片段

 var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; JsonSerializerSettings jSettings = new JsonSerializerSettings() { Culture = System.Globalization.CultureInfo.CurrentCulture }; jsonFormatter.SerializerSettings = jSettings; 

文化pt-BR使用默认的dd-MM-yyyy ,如果您不想将文化放在WebConfig中,则只能为该对象创建实例。

根据我的经验,最简单和最简单的解决方案是在您的CLR对象( MyObject )上添加一个string属性,以供JSON.Net使用。 同样在你的对象上,你只放置一个DateTime属性作为getter,它将使用你期望的格式解析你使用JSON.Net反序列化的日期时间字符串。

这使您可以使用开箱即用的反序列化器,并依靠良好的“塑造”来完成工作。 没有麻烦,没有大惊小怪。

 public class MyObject { public string dtStr { get; set; } public DateTime? dt { get { DateTime? d = null; if (!string.IsNullOrWhiteSpace(dtStr) && DateTime.TryParseExact(dtStr, "dd/mm/yyyy", CultureInfo.InvariantCultureDateTimeStyles.None, out d) { return d; } return d; } } }