我有一个接受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的私有成员,它似乎包含原始字符串,但我无法在转换器中访问它。
答案 0 :(得分:0)
根据:
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" };
myObject obj = JsonConvert.DeserializeObject<myObject>(myJSONString, dateTimeConverter);