【问题标题】:Force JObject to serialzie date in "dd-mm-yyyy" format强制对象以“dd-mm-yyyy”格式序列化日期
【发布时间】:2015-11-28 12:16:01
【问题描述】:
public Guid AddJobs(JObject parametrs)
{
        dynamic jsonParameters = parametrs;
        JobViewModel job = jsonParameters.Job.ToObject<JobViewModel>();
}

以上是我的代码。我正在尝试使用上述方法反序列化此模型。问题是它一直给我一个例外,即日期格式不正确,因为它不期望“dd-mm-yyyy”。请帮帮我。

【问题讨论】:

    标签: c# .net json.net deserialization


    【解决方案1】:

    这里有两种方法:

    1.直接在序列化器上设置格式。它会在不正确的值上抛出异常。

    var jsonSer = new JsonSerializer();
    jsonSer.DateFormatString = "dd-MM-yyyy";
    JobViewModel job = obj.ToObject<JobViewModel>(jsonSer);
    

    2.创建自定义转换器,处理错误值无异常:

    public class CustomDateConverter : Newtonsoft.Json.Converters.DateTimeConverterBase
    {
        private static readonly string DateTimeFormat = "dd-MM-yyyy";
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            DateTime res; // default value of a date is 01/01/0001
    
            // if parsing is successful that value will be changed, otherwise you get the default value and not and exception
            DateTime.TryParseExact(reader.Value.ToString(), DateTimeFormat, null, DateTimeStyles.None, out res); 
    
            return res;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(((DateTime)value).ToString(DateTimeFormat));
        }
    }
    

    并将转换器添加到您的序列化程序中:

    var jsonSer = new JsonSerializer();
    jsonSer.Converters.Add(new CustomDateConverter());
    JobViewModel job = obj.ToObject<JobViewModel>(jsonSer);
    

    【讨论】:

    • 感谢您的回复。你能告诉我如何为整个网站默认设置它吗?我不想在每个函数中都这样做。难道没有一种全球性的方法吗?
    • @SafiMustafa - 您可以自定义默认序列化程序。看这里:stackoverflow.com/questions/13274625/…
    • 如果打扰到你,请原谅。还有一件事,如果我只给出像“28-10-2015”这样的日期并给出“dd-mm-yyyy”格式,它会正确反序列化。但是,如果我也像这样给它“28-11-2015 04:29 PM”的时间并给出格式“dd-mm-yy hh:mm tt”,那么它会给我错误。我在这里错过了什么?
    • @SafiMustafa - 大写“M”:dd-MM-yyyy hh:mm tt
    • 感谢您帮助我。
    【解决方案2】:

    这里有几件事可以尝试。

    不知道这是否有效,但您可以尝试在模型中的数据注释中设置DisplayFormat 属性并在那里指定日期格式。

    根据您正在使用的 JSON 库,您可以探索它是否具有某种日期格式转换工具或您可以在使用时以编程方式进行的某些设置。

    再次不确定,但您可以将该字段指定为string,然后在反序列化后,将其转换为所需格式的日期时间。

    由于您使用的是 Json.Net,请参阅他们的文档和其中一个链接:Click here

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2014-11-25
      相关资源
      最近更新 更多