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);
}
}
}
有什麼我可以做什麼?
好,知道了。將DateParseHandling設置爲none只會強制解析爲解析器而不是解析器,然後我的轉換器就有機會正確處理它。謝謝! – Volker