C# 在WebAPI中仅从JSON反序列化特定的日期时间格式
我有一个WebAPI设置,它使用Newtonsoft.JSON包接受JSON,其中一个字段是DateTime 为了避免无效或不明确的日期格式出现问题,我只希望在输入上接受特定的日期格式 例如,仅接受:C# 在WebAPI中仅从JSON反序列化特定的日期时间格式,c#,json,datetime,asp.net-web-api,C#,Json,Datetime,Asp.net Web Api,我有一个WebAPI设置,它使用Newtonsoft.JSON包接受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:4
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的私有成员,它似乎包含原始字符串,但我无法在转换器中访问它。根据:
福伊的回答如下:
var dateTimeConverter=new IsoDateTimeConverter{DateTimeFormat=“dd/MM/yyyy”};
myObject obj=JsonConvert.DeserializeObject(myJSONString,dateTimeConverter);
如果一个答案足够接近,您可以引用另一个问题的答案,您可能会投票将该问题作为一个重复问题关闭。不幸的是,这不足以让JSON进入WebAPI,因为序列化是自动完成的。我不知道在哪里需要在WebAPI请求上手动使用JsonConvert?
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" };
myObject obj = JsonConvert.DeserializeObject<myObject>(myJSONString, dateTimeConverter);