我想拒绝带有日期的传入JSON请求正文,以使用JSON.Net使用UTC时间格式(以消除由于时区引起的歧义)。我研究了以下选项,但没有成功:
firstdomain
,但似乎无法找到选项JsonSerializerSettings
,DateFormatString
,DateFormatHandling
和{ {1}}会主动限制此类请求。如果有一种使用这些选项的解决方案能够以错误的格式拒绝传入的日期,我将很高兴。DateParseHandling
(使用DateTimeZoneHandling
或JsonConverter
);但是其中的JsonConverter
类型是DateTimeConverterBase
,而JsonToken
已经是Date
对象,因此我无法验证提供的字符串(或者是否有办法我想念它。)我希望有人知道如何在将JSON日期对象自动反序列化为reader.Value
对象之前对其进行反序列化,并且可以为我提供帮助。
答案 0 :(得分:1)
一种方法是将DateParseHandling设置为不转换DateTime字符串,然后为DateTime定制JsonConverter的组合
一个非常简单的Datetime转换器,如果其非UTC日期时间可能会崩溃
public class DateTimeConverter : JsonConverter<DateTime>
{
public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
{
writer.WriteValue(value.ToString("u"));
}
public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
{
string s = (string)reader.Value;
return DateTime.ParseExact(s,"u", CultureInfo.InvariantCulture);
}
}
然后您的反序列化代码如下:
var settings = new JsonSerializerSettings()
{
DateParseHandling = DateParseHandling.None,
Converters = new List<JsonConverter>()
{
new DateTimeConverter()
}
};
var deserialized = JsonConvert.DeserializeObject<MyDate>(json, settings);