代码之家  ›  专栏  ›  技术社区  ›  Jake Conkerton-Darby

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

  •  0
  • Jake Conkerton-Darby  · 技术社区  · 6 年前

    我想用JSON.Net拒绝传入的JSON请求体,这些请求体的日期是使用UTC时间格式的(以消除由于时区造成的歧义)。我研究了以下选项,但目前没有成功:

    • JsonSerializerSettings DateFormatString , DateFormatHandling , DateParseHandling & DateTimeZoneHandling
    • 我还研究了创建一个自定义 JsonConverter JSON转换器 DateTimeConverterBase JsonToken 它们的类型是 Date 以及 reader.Value 已经是一个 DateTime 对象,所以我无法验证提供的字符串(或者如果有某种方式我丢失了它)。

    我希望有人知道如何在JSON日期对象自动转换为 日期时间

    1 回复  |  直到 6 年前
        1
  •  1
  •   PhilS    6 年前

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

    一个非常简单的Datetime转换器,如果不是UTC Datetime,它会崩溃

        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);