首页 > 解决方案 > .NET Core - 读取 JSON 文件的转换日期

问题描述

有什么方法可以转换从 JSON 文件读取的日期?我的文件中的示例记录是:

{
    "UserID": 73274,
    "Created": "17-03-2018 06:35",
    "Office": "Washington"
},

我正在做的是导入 JSON 文件并将其内容保存到数据库。问题是,当日期是DD-MM-YYYY hh:ss格式时,它根本不起作用。但是当日期是YYYY-MM-DDThh:mm:ss格式时,一切都很好。读取此文件后如何将日期解析为另一种格式并对具有解析日期的文件执行以下操作?

我负责此操作的部分控制器是:

if (file.ContentType == "application/json")
{
    try
    {
        using (var reader = new StreamReader(file.OpenReadStream()))
        {
            content = reader.ReadToEnd();
        }
     }
     catch
     {
         return BadRequest(Messages.fileNotChosen);
     }
     try
     {
         userObjects = JsonConvert.DeserializeObject<List<UserImportModel>>(content);
     }
     catch
     {
         return BadRequest();
     }
 }

当日期格式为YYYY-MM-DDThh:mm:ss时,正确计算 userObjects 并且控制器移动到我执行添加到数据库的部分。当日期格式为DD-MM-YYYY hh:ss时,userObjects = 0 并且控制器移动到 catch,然后返回 BadRequest()。

编辑:UserImportModel课程代码:

public class UserImportModel
{

    public string UserID { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime Created { get; set; }

    public string Office { get; set; }

}

标签: c#asp.netjsondateasp.net-core

解决方案


如果您需要以不同格式反序列化日期,则必须创建自定义JsonConverter

public class MultiFormatDateTimeConverter : JsonConverter
{
    private List<string> formats;

    public MultiFormatDateTimeConverter(List<string> formats)
    {
       this.formats = formats;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string dateString = (string)reader.Value;

        foreach (string format in formats)
        {
            if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date))
            {
                return date;
            }
        }
        throw new JsonException("Unable to parse \"" + dateString + "\" as a date.");
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

使用示例:

var settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
settings.Converters.Add(new MultiFormatDateTimeConverter(new List<string> { "DD-MM-YYYY hh:ss", "YYYY-MM-DDThh:mm:ss" }));

userObjects = JsonConvert.DeserializeObject<List<UserImportModel>>(content, settings);

推荐阅读