【问题标题】:Read raw Date string in a Custom JsonConverter of JSON.net在 JSON.net 的自定义 JsonConverter 中读取原始日期字符串
【发布时间】:2020-11-13 00:24:54
【问题描述】:

我有一个 ISO 8601 格式的输入日期字符串 (2020-07-23T09:42:02.694Z)。在我的控制器中,属性定义为DateTime。我编写了一个自定义日期转换器来将日期转换为 LocalTime 区域(这很不寻常)。

public class UTCtoUnspecifiedDateConverter : IsoDateTimeConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader != null 
            && reader.Value != null 
            && this.CanConvert(objectType) 
            && this.CanRead 
            && typeof(DateTime) == reader.Value.GetType())
        {
            return DateTime.SpecifyKind((DateTime)reader.Value, DateTimeKind.Unspecified).ToLocalTime();
        }
        else
        {
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }
    }
}

有什么方法可以在此转换器中获取我从客户端发送的原始字符串?
基本上我想检查最后是否有Z

在调试时,我在 reader 上看到了一个 private 属性,它存储了此信息。有什么办法可以在这里得到这个?

【问题讨论】:

    标签: c# .net json.net asp.net-web-api2 customserializer


    【解决方案1】:

    如果您使用自定义JsonConverter 处理日期,则需要将DatePraseHandling 设置为None

    var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
    jsonSettings.Converters.Add(new UTCtoUnspecifiedDateConverter());
    jsonSettings.DateParseHandling = DateParseHandling.None;
    

    然后,在您的转换器中,您将从reader 获取日期值作为字符串,您可以使用DateTime.TryParseDateTime.TryParseExact 对其进行解析。

    顺便说一句,您在ReadJson 内部进行了一些不必要的检查。您不需要调用CanConvertCanRead,因为Json.Net 会为您首先确定是否调用ReadJson。此外,传递给ReadJsonreader 永远不会为空,因此您也不需要检查它。这样就大大简化了代码。

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value is string && 
            DateTime.TryParseExact((string)reader.Value, DateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
        {
            return DateTime.SpecifyKind(date, DateTimeKind.Unspecified).ToLocalTime();
        }
        else
        {
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多