使用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; } } }