2017-08-02 32 views
1

我試圖改變Newtonsoft序列化程序如何處理像「2017-05-27」這樣的字符串。Newtonsoft.Json試圖猜測令牌類型並使其錯誤

所以,我創建了一個類來代替DateTime,該類型的轉換器,並希望它會。

問題是,對於「2017-05-27」它確實有效。但是,如果出於某種原因,我得到「2017-05-27T23:50:27:00」,即一個完整的ISO 8601字符串,JsonReader假裝是智能的,並將其視爲日期時間而不是字符串。

有什麼方法可以改變這種行爲嗎?

我迄今所做的代碼是這樣的:

using System; 
using System.Text.RegularExpressions; 
using Newtonsoft.Json; 

namespace ConverterGames 
{ 
    public class MyDate 
    { 
     public int Year { get; set; } 
     public int Month { get; set; } 
     public int Day { get; set; } 
    } 
    public class Xxx 
    { 
     public MyDate Aaa { get; set; } 
    } 

    public class DateJsonConverter : JsonConverter 
    { 
     private readonly Regex _isoDate = new Regex(@"^(\d+)-(\d+)-(\d+).*", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      // gives "string" for 2017-04-27 :-) 
      // gives DateTime for 2017-04-27T20:00:00.00 :-(
      // I want string only here. 
      Console.WriteLine(reader.Value.GetType()); 

      Match m = _isoDate.Match((string)reader.Value); 
      if (!m.Success) 
      { 
       throw new Exception($"Format error for {(string)reader.Value}"); 
      } 
      return new MyDate 
      { 
       Year = Int32.Parse(m.Groups[1].Value), 
       Month = Int32.Parse(m.Groups[2].Value), 
       Day = Int32.Parse(m.Groups[3].Value), 
      }; 
     } 

     public override bool CanConvert(Type objectType) 
     { 
      return objectType == typeof(MyDate); 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      string Data = "{\"aaa\":\"2017-05-12\"}"; 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.Converters.Add(new DateJsonConverter()); 

      // good 
      Xxx x= JsonConvert.DeserializeObject<Xxx>(Data, settings); 
      Console.WriteLine(x.Aaa.Year); 


      // fails 
      Data = "{\"aaa\":\"2017-05-12T08:15:00\"}"; 
      x = JsonConvert.DeserializeObject<Xxx>(Data, settings); 
      Console.WriteLine(x.Aaa.Year); 
     } 
    } 
} 

有什麼我可以做什麼?

回答

3

是的。既然你要處理的日期解析自己,你只需要設置DateParseHandlingNone在串行器設置:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.DateParseHandling = DateParseHandling.None; 
settings.Converters.Add(new DateJsonConverter()); 

小提琴:https://dotnetfiddle.net/3WSj6Q

+0

好,知道了。將DateParseHandling設置爲none只會強制解析爲解析器而不是解析器,然後我的轉換器就有機會正確處理它。謝謝! – Volker