Десериализовать значение метки времени в JSON в DateTime при привязке модели - PullRequest
0 голосов
/ 02 мая 2018

Я разрабатываю веб-API с использованием ASP.NET Core 2, и у меня есть класс Model следующим образом.

public class Model
{
   int id { get; set; }
   DateTime date { get; set; }
}

Я использую JSON в теле запроса. Запрос Json похож на

{
  "id" : 1,
  "date" : 1525261719 
}

Привязка этих данных JSON к классу Model, как это в Controller

[HttpPost]
public async Task<IActionResult> PostEvent([FromBody] Model model)
{ 
    // Some code here
}

Мне не удалось проанализировать метку времени Unix в тип DateTime. Я видел несколько примеров, таких как JSON Converter, IModelBinder ничего не помогает. Поскольку я был новичком в мире .NET, я не знаю, как решить эту проблему.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 13 августа 2018

Я нашел решение для этого. Я использовал ITypeConverter

// Converts timestamp to DateTime
public class DateTimeConverter : ITypeConverter<long?, DateTime?>
{
    private readonly DateTime _epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    public DateTime? Convert(long? source, DateTime? destination, ResolutionContext context)
    {
        if (!source.HasValue) return null;
        return _epoch.AddSeconds(source.Value);
    }
}

// Converts DateTime to Timestamp
public class TimeStampConverter : ITypeConverter<DateTime?, long?>
{
    private readonly DateTime _epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    public long? Convert(DateTime? source, long? destination, ResolutionContext context)
    {
        if (source == null) return null;
        var result = (long)(source - _epoch).Value.TotalSeconds;
        return result;
    }
}

И я создал такую ​​карту в startup.cs

AutoMapper.Mapper.Initialize(x =>
            {
                x.CreateMap<long?, DateTime?>().ConvertUsing<DateTimeConverter>();
                x.CreateMap<DateTime?, long?>().ConvertUsing<TimeStampConverter>();
            });

Я использовал эту пару классов в своем проекте, и он работает нормально. Это может помочь любому, кто пытается достичь того же.

0 голосов
/ 12 августа 2018

У меня была такая же проблема. Я написал этот JsonConverter. Имейте в виду, что это специально для моей конкретной ситуации.

public class UnixEpochTimeToDateTimeConverter: JsonConverter
{
    public override bool CanWrite => false;

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {

        if (reader.TokenType == JsonToken.Null) return null;
        if (reader.TokenType != JsonToken.Integer) return null;
        if (!reader.Path.Contains("time")) return null;

        return long.TryParse(reader.Value.ToString(), out var epoch)
            ? DateTimeOffset.FromUnixTimeMilliseconds(epoch).DateTime
            : DateTime.Now;
    }

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