.NET Core - дата конвертации прочитанного файла JSON - PullRequest
0 голосов
/ 10 сентября 2018

Есть ли способ конвертировать дату чтения из файла 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 и контроллер переходит к перехвату, который затем возвращает 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; }

}

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

JSON.Net использует стандарт 8601 для представления даты-времени . Расширенный формат для полного выражения даты и времени: «ГГГГ-ММ-ДДТЧ: ММ: СС». Метод JSON.Net «Deserializer» ( DeserializeObject ) перегружен для приема пользовательских форматеров, вы можете использовать de IsoDateTimeConverter , указав в свойстве DateTimeFormat формат вашего строка "дд"

userObjects = JsonConvert.DeserializeObject<List<UserImportModel>>(content, 
                   new IsoDateTimeConverter { DateTimeFormat = "dd-MM-yyyy hh:mm:ss" });

Другой альтернативой является использование регулярного выражения для замены всех неверно сформированных дат ISO в строке JSON перед вызовом метода DeserializeObject .

0 голосов
/ 10 сентября 2018

Если вам нужно десериализовать дату в разных форматах, вам нужно создать пользовательский 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...