JObject ToObject - 在"bad date"转换时崩溃



我使用JObject来处理我的客户端帖子。
我使用ToObject函数将JObject转换为强类型实体。

当datetime值无效时-例如2952014(since there aren't 29 months),我得到一个异常:

Could not convert string to DateTime: 29/05/2014. Path 'PurchaseDate.Value'.

我理解异常,我希望在这种情况下防止崩溃。

如何告诉JObject忽略无效的日期值?在我的具体情况下,我的实体是一个可空的datetime对象,所以如果解析失败(而不是崩溃),我希望保持为空。

在这个特定的情况下,我谈论的是一个日期时间,但如果有人能给我一个更通用的答案,关于我如何能防止失败的"无效解析转换",那将是伟大的,因为我所有的实体都包含可空字段,我不想在客户端处理验证

您不能仅对无效日期禁用它们,但您可以停止对日期值的解析,将它们存储为字符串,并在以后实现自定义解析。

jObject.ToObject<MyObject>(  new JsonSerializer {
                          DateParseHandling = DateParseHandling.None
                   });

我找到了一个工作-添加一个转换器:

   var js = new JsonSerializer
   {
       DateParseHandling = DateParseHandling.DateTime,
   };
   js.Converters.Add(new DateTimeConverter());
   dynamic jsonObject = new JObject();
   jsonObject.Date = "29/05/2014";
   var entty = ((JObject)jsonObject).ToObject<Entity>(js);

定义:

    public class Entity
    {
        public DateTime? Date { get; set; }
    }
    public class DateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            DateTime val;
            if (reader.Value != null && DateTime.TryParse(reader.Value.ToString(), out val))
            {
                return val;
            }
            return null;
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(((DateTime)value).ToString("MM/dd/yyyy"));
        }
    }

最新更新