c# - .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; }
}
解决方案
如果您需要以不同格式反序列化日期,则必须创建自定义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);
推荐阅读
- c++ - 访问由朋友或成员函数在类中定义的私有结构
- r - 如何从 R 中的平均小时数(来自 30 秒数据表)中获取数据
- javascript - 如何在jemter中为序列化json数据编写正则表达式
- ios - 如何检查 XCTest 中的方法 - 仅在目标 C 中
- ios - 如何动画进度视图?
- gpu - 在 Google Colab 上支持 GPU 的 XGBoost
- nsstackview - 为什么添加到 NSStackView 时只有一个子视图可见
- angular - Express.js 对 Angular CORS 错误的响应
- javascript - REACT REDUX 连接失败
- reactjs - 当数据来自.js文件函数时如何定义ReactJS IState接口