将 JSON 反序列化为 DateTime 属性 会引发异常
Deserializing JSON to DateTime property throws exception
我正在尝试反序列化以下 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: 'The JSON value could not be converted to System.DateTime. Path: $.PublikationsDatum | LineNumber: 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; }
我做错了什么?如何将 JSON 的 publikationsDatum
反序列化回 DateTime?
提前致谢
编辑:我们没有使用任何 JSON 库,并希望保持这种状态。我们正在使用 System.Text.Json
/Date( and )/中的数字是自 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 fiddle:
https://dotnetfiddle.net/tAK62c
我正在尝试反序列化以下 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: 'The JSON value could not be converted to System.DateTime. Path: $.PublikationsDatum | LineNumber: 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; }
我做错了什么?如何将 JSON 的 publikationsDatum
反序列化回 DateTime?
提前致谢
编辑:我们没有使用任何 JSON 库,并希望保持这种状态。我们正在使用 System.Text.Json
/Date( and )/中的数字是自 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 fiddle: https://dotnetfiddle.net/tAK62c