强制 JObject 以“dd-mm-yyyy”格式序列日期

Force JObject to serialzie date in "dd-mm-yyyy" format

提问人:Safi Mustafa 提问时间:11/28/2015 更新时间:11/28/2015 访问量:3480

问:

public Guid AddJobs(JObject parametrs)
{
        dynamic jsonParameters = parametrs;
        JobViewModel job = jsonParameters.Job.ToObject<JobViewModel>();
}

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

C# .NET json.net 反序列化

评论


答:

0赞 Dhrumil 11/28/2015 #1

在这里尝试几件事。

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

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

同样不确定这一点,但您可以将该字段指定为 然后在反序列化后,将其转换为具有所需格式的日期时间。string

由于您使用的是 Json.Net,请参阅他们的文档和链接之一:点击这里

希望这会有所帮助。

5赞 Amir Popovich 11/28/2015 #2

以下是两种方法:

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

评论

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