在WebAPI中仅从JSON反序列化特定的DateTime格式

时间:2017-04-24 14:26:37

标签: c# json datetime asp.net-web-api

我有一个接受JSON的WebAPI设置,使用Newtonsoft.Json包,其中一个字段是DateTime。

为了避免无效或含糊不清的日期格式出现问题,我只想接受输入中的特定日期格式。

例如,只接受:

var validFormats = new string[]
{
    "yyyy-MM-ddTHH:mm:ss",           // 2009-06-15T13:45:30
    "yyyy-MM-ddTHH:mm:ss.fffffffzz", // 2009-06-15T13:45:30.0000000-07:00
};

我遇到的问题是,无论我在哪里尝试进行任何手动格式验证或解析,似乎解析器已经反序列化并将字符串转换为DateTime对象,因此我无法获取原始日期要检查的格式。

实现这一目标的最佳方法是什么?

更新1:

我最接近的是使用自定义转换器:

public class JsonDateTimeConverter : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var validFormats = new string[]
        {
            "yyyy-MM-ddTHH:mm:ss",           // 2009-06-15T13:45:30
            "yyyy-MM-ddTHH:mm:ss.fffffffzz", // 2009-06-15T13:45:30.0000000-07:00
        };

        DateTime dt;
        if (DateTime.TryParseExact(reader.Value.ToString(), validFormats, null, DateTimeStyles.None, out dt))
        {
            return dt;
        }

        throw new JsonException("Failed to parse DateTime");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString("o"));
    }
}

配置为在WebApiConfig中用作

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new JsonDateTimeConverter());

但是这仍然存在reader.value似乎已经转换为DateTime对象的问题。 JsonReader上有一个名为_stringReference的私有成员,它似乎包含原始字符串,但我无法在转换器中访问它。

1 个答案:

答案 0 :(得分:0)

根据:

  

福伊的答案来自:https://stackoverflow.com/a/37441177/2711861

var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" };
myObject obj = JsonConvert.DeserializeObject<myObject>(myJSONString, dateTimeConverter);