gpt4 book ai didi

c# - .Net Core 3.0 TimeSpan 反序列化错误 - 在 .Net 5.0 中修复

转载 作者:行者123 更新时间:2023-12-04 11:09:01 25 4
gpt4 key购买 nike

我正在使用 .Net Core 3.0 并有以下字符串,我需要用 Newtonsoft.Json 反序列化:

{
"userId": null,
"accessToken": null,
"refreshToken": null,
"sessionId": null,
"cookieExpireTimeSpan": {
"ticks": 0,
"days": 0,
"hours": 0,
"milliseconds": 0,
"minutes": 0,
"seconds": 0,
"totalDays": 0,
"totalHours": 0,
"totalMilliseconds": 0,
"totalMinutes": 0,
"totalSeconds": 0
},
"claims": null,
"success": false,
"errors": [
{
"code": "Forbidden",
"description": "Invalid username unknown!"
}
]
}

并遇到以下错误:
   Newtonsoft.Json.JsonSerializationException : Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.TimeSpan' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly.
To fix this error either change the JSON to a JSON primitive value (e.g. string, number, boolean, null) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'cookieExpireTimeSpan.ticks', line 1, position 103.

错误字符串实际上是在读取 HttpResponseMessage 的内容时发生的:
var httpResponse = await _client.PostAsync("/api/auth/login", new StringContent(JsonConvert.SerializeObject(new API.Models.Request.LoginRequest()), Encoding.UTF8, "application/json"));
var stringResponse = await httpResponse.Content.ReadAsStringAsync();

服务器 Controller 方法返回:
return new JsonResult(result) { StatusCode = whatever; };

最佳答案

REST API 服务不应生成这样的 JSON 字符串。我敢打赌以前的版本返回 00:0:00而不是 TimeSpan 对象的所有属性。

原因是.NET Core 3.0 replaced JSON.NET使用新的内置 JSON 序列化程序,System.Text.Json .这个序列化器 doesn't support TimeSpan .新的序列化器速度更快,在大多数情况下不分配,但并未涵盖 JSON.NET 所做的所有情况。

在任何情况下,都没有用 JSON 表示日期或句点的标准方法。甚至 ISO8601 格式也是一种约定,而不是标准本身的一部分。 JSON.NET 使用可读格式 ( 23:00:00 ),但 ISO8601's duration格式看起来像 P23DT23H (23 天 23 小时)或 P4Y (4 年)。

一种解决方案是返回到 JSON.NET。文档中描述了这些步骤:

  • 添加对 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的包引用.
  • 更新 Startup.ConfigureServices 以调用 AddNewtonsoftJson。
  • services.AddMvc()
    .AddNewtonsoftJson();

    另一种选择是使用该类型的自定义转换器,例如:
    public class TimeSpanToStringConverter : JsonConverter<TimeSpan>
    {
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
    var value=reader.GetString();
    return TimeSpan.Parse(value);
    }

    public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
    {
    writer.WriteStringValue(value.ToString());
    }
    }

    并在 Startup.ConfigureServices 中注册与 AddJsonOptions ,例如:
    services.AddControllers()                    
    .AddJsonOptions(options=>
    options.JsonSerializerOptions.Converters.Add(new TimeSpanToStringConverter()));

    关于c# - .Net Core 3.0 TimeSpan 反序列化错误 - 在 .Net 5.0 中修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58283761/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com