0

我正在尝试反序列化以下 JSON:

{
    "Anriss": "SomeAnriss",
    "ArtikelId": 123123,
    "Image": null,
    "KanalId": 101,
    "MediumName": "SomeMediumName",
    "PublikationsDatum": "/Date(1573581177000)/",
    "Titel": "SomeTitel",
    "Link": null
}

通过此方法调用:

await this.jsonHelper.DeserializeJsonContent<AvenueArtikelDetail>(httpResponseMessage.Content);

方法:

public async Task<T> DeserializeJsonContent<T>(HttpContent responseContent)
{
    var content = await responseContent.ReadAsStringAsync();
    var deserializedJsonContent = JsonSerializer.Deserialize<T>(content, new JsonSerializerOptions {PropertyNameCaseInsensitive = true, IgnoreNullValues = true});
    return deserializedJsonContent;
}

不幸的是,我收到以下错误:

System.Text.Json.JsonException: '无法将 JSON 值转换为 System.DateTime。路径:$.PublikationsDatum | 行号:0 | BytePositionInLine:353。

JSON 来自对此 API 方法的调用:

[HttpGet]
[AllowAnonymous]
public async Task<JsonResult> GetArtikelDetail(ArtikelDetailSearchDto searchDto)
{
    var artikelDetail = this.artikelDetailService.GetArtikelDetailBy(searchDto);
    return this.Json(artikelDetail, JsonRequestBehavior.AllowGet);
}

publikationsDatum是一个正常的DateTime属性

public DateTime PublikationsDatum { get; set; }

我究竟做错了什么?如何publikationsDatum将 JSON 反序列化回 DateTime?

提前致谢

编辑:我们没有使用任何 JSON 库,并希望保持这种状态。我们正在使用System.Text.Json

4

1 回答 1

1

/Date()/中的数字是自 UNIX 纪元以来的毫秒数。

您可以像这样制作自定义转换器:

public class DateTimeConverter : JsonConverter<DateTime>
{

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // You should do some fool proof parsing here
        var s = reader.GetString();
        s=s.Replace("/Date(","").Replace(")/","");
        long epoch = Convert.ToInt64(s);
        DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(epoch);
        return dateTimeOffset.UtcDateTime;
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        // Do some conversion here
    }
}

这是一个 .net 小提琴: https ://dotnetfiddle.net/tAK62c

于 2019-11-22T15:03:10.607 回答