【问题标题】:How can I restrict date format in JSON.Net?如何限制 JSON.Net 中的日期格式?
【发布时间】:2018-10-29 09:46:47
【问题描述】:

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

  • 我查看了JsonSerializerSettings,似乎无法找到有效限制此类请求的选项DateFormatStringDateFormatHandlingDateParseHandlingDateTimeZoneHandling 的组合。如果有使用这些选项的解决方案可以拒绝格式错误的传入日期,我会很高兴。
  • 我还研究过创建自定义JsonConverter(使用JsonConverterDateTimeConverterBase);但是 JsonToken 类型是 Date 并且 reader.Value 已经是 DateTime 对象,所以我无法验证提供的字符串(或者如果有办法我错过了它)。

我希望有人知道如何在 JSON 日期对象自动转换为 DateTime 对象之前验证它的反序列化,并且可以帮助我。

【问题讨论】:

  • 表示你需要找到一种知道日期格式的方法对吗?
  • UTC 不是一种格式...也许您误认为是 ISO8601?无论如何,您可以使用 Json Schema 来验证 json 结构(包括数据类型)。
  • @ershoaib 是的,这就是目的。
  • @ZoharPeled 对不起,我对条款草率了。是的,我的意思是 ISO8601 格式的日期,但它们是以 UTC 时间明确给出的,例如"2018-10-29T10:41:32Z" 将被接受,但 "018-10-29T10:41:32""018-10-29T10:41:32+03:00" 将被拒绝。

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


【解决方案1】:

一种方法是将 DateParseHandling 组合设置为不转换 DateTime 字符串,然后为 DateTime 自定义 JsonConverter

一个非常简单的日期时间转换器,如果它不是 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);

【讨论】:

  • 感谢您的回答,但不幸的是,我刚刚对此进行了测试,并使用"u" 作为格式字符串不起作用。特别是它会为有效日期和无效日期引发异常。然而,结构本身似乎是有效的,这很好。
  • 我用这个结构和格式字符串@"yyyy-MM-dd\THH:mm:ss\Z"来得到想要的结果。
  • 对不起"u"是格式"yyyy'-'MM'-'dd HH':'mm':'ss'Z'"中间没有T。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多