如何限制JSON.Net中的日期格式?

时间:2018-10-29 09:46:47

标签: c# json datetime .net-core json.net

我想拒绝带有日期的传入JSON请求正文,以使用JSON.Net使用UTC时间格式(以消除由于时区引起的歧义)。我研究了以下选项,但没有成功:

  • 我看过firstdomain,但似乎无法找到选项JsonSerializerSettingsDateFormatStringDateFormatHandling和{ {1}}会主动限制此类请求。如果有一种使用这些选项的解决方案能够以错误的格式拒绝传入的日期,我将很高兴。
  • 我还研究过创建自定义DateParseHandling(使用DateTimeZoneHandlingJsonConverter);但是其中的JsonConverter类型是DateTimeConverterBase,而JsonToken已经是Date对象,因此我无法验证提供的字符串(或者是否有办法我想念它。)

我希望有人知道如何在将JSON日期对象自动反序列化为reader.Value对象之前对其进行反序列化,并且可以为我提供帮助。

1 个答案:

答案 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);
相关问题