JObject ToObject - 在“糟糕的约会”转换时崩溃

时间:2014-07-03 09:18:40

标签: c# parsing datetime

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

当日期时间值无效时 - 让我们说29\05\2014(since there aren't 29 months),我得到一个例外:

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

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

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

在这个特定的情况下,我说的是一个日期时间,但如果有人可以给我一个更通用的答案,我可以防止“无效的解析\转换”失败,那将是很好的,因为我的所有实体都包含可空字段,我不想在客户端处理验证。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我找到了解决方法 - 添加转换器:

   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"));
        }
    }