2014-01-21 37 views
21

我試圖從JSON數據反序列化一個C#類(我使用Newtonsoft Json.NET): 數據包含字符串值中的日期09/12/2013其中格式爲dd/mm/yyyy使用Json.Net反序列化的日/月/年/ yyyy格式

如果我打電話給JsonConvert.DeserializeObject<MyObject>(data); 日期在C#類的datetimes屬性上加載,如mm/dd/yyyy,然後日期值是2013年9月12日(而不是2013年12月9日)。

是否可以配置JsonConvert以正確格式獲取日期?

回答

33

您可以使用IsoDateTimeConverter,並指定DateTimeFormat得到你想要的結果,例如:

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

演示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @"{ ""Date"" : ""09/12/2013"" }"; 

     MyObject obj = JsonConvert.DeserializeObject<MyObject>(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 
5

你也可以在JsonSerializer中配置它:

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

多虧了這一點,我想出了: '公共靜態牛逼FromJSON (此字符串str) \t \t { \t \t VAR串行=新JsonSerializer {DateFormatString = 「DD-MM-YYYY」}; \t \t return serializer.Deserialize (new JsonTextReader(new StringReader(str))); }' – Makassi

2
using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 

var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }; 
myObject obj = JsonConvert.DeserializeObject<myObject>(myJSONString, dateTimeConverter); 
0

加入文化WebConfig:

<system.web> 
    <globalization culture="pt-BR" uiCulture="pt-BR" enableClientBasedCulture="true"/> 
</system.web> 

然後添加下面的WebApiConfig.cs文件

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

jsonFormatter.SerializerSettings = jSettings; 

文化 「PT-BR」 的工作原理與默認的代碼片段「dd-MM-yyy」,如果你不想把文化置於WebConfig中,你可以只爲該對象創建一個實例。

0

根據我的經驗,最簡單和最簡單的解決方案總是在您的案例中爲您的CLR對象(MyObject)添加一個string屬性以供JSON.Net使用。同樣在你的對象上,你放置一個DateTime屬性,只作爲一個getter,它將以你期望的格式解析你使用JSON.Net反序列化的日期時間字符串。

這可以讓你使用開箱即用的解串器,並依靠良好的「老式C#」完成工作。沒有麻煩,沒有大驚小怪。

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