【问题标题】:JObject ToObject - Crashes on a "bad date" conversionsJObject ToObject - 在“错误日期”转换时崩溃
【发布时间】:2014-07-03 09:18:39
【问题描述】:

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

当日期时间值无效时 - 比如说29\05\2014(since there aren't 29 months),我得到一个异常:

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

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

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

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

【问题讨论】:

    标签: c# parsing datetime


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,我知道这个功能,我不能只将日期时间更改为字符串,因为我需要向后兼容使用相同实体的旧系统。你知道如何告诉他使用“TryParse”而不是“Parse”吗?
    • 您可能需要实现自定义 json 序列化程序。这里有一个例子stackoverflow.com/questions/17856580/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多