人们能做的就是添加一个custom JsonConverter http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm to the InputModel
键入临时切换JsonReader.DateParseHandling http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonReader_DateParseHandling.htm to None
:
[JsonConverter(typeof(DateParseHandlingConverter), DateParseHandling.None)]
class InputModel
{
public string Name { get; set; }
public object Value { get; set; }
}
public class DateParseHandlingConverter : JsonConverter
{
readonly DateParseHandling dateParseHandling;
public DateParseHandlingConverter(DateParseHandling dateParseHandling)
{
this.dateParseHandling = dateParseHandling;
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var old = reader.DateParseHandling;
try
{
reader.DateParseHandling = dateParseHandling;
existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
serializer.Populate(reader, existingValue);
return existingValue;
}
finally
{
reader.DateParseHandling = old;
}
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
请注意,如果要反序列化的 JSON 包含嵌套数组或对象,则所有递归包含的值将被解析为DateParseHandling.None
.
有人可能会问,为什么不直接向属性添加一个转换器,就像这样呢?
class InputModel
{
public string Name { get; set; }
[JsonConverter(typeof(DateParseHandlingConverter), DateParseHandling.None)]
public object Value { get; set; }
}
事实证明这行不通,因为当时JsonConverter.ReadJson() http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConverter_ReadJson.htm被调用时,读者已经前进到日期字符串并将其标记为DateTime
.因此转换器必须应用于包含类型。