将带有 TimeSpan 属性的 JSON 对象传递给 C# WebAPI

问题描述 投票:0回答:1

我有一个 WebAPI(用 C# 编写)、一个接受带有名为 TriggerDelay 的 System.TimeSpan-Property 的复杂对象的 POST 方法,以及一个 React Native 应用程序,我从其中以 JSON 格式传递该对象。

但是,此 TimeSpan 属性未正确序列化,我不断在 API 端获取 00:00:00 值。

我正在尝试这样:

"triggerDelay":{
        "hours": "30",
        "minutes": "10",
        "seconds": "0"
    },

或者像这样:

"triggerDelay": "30:10:00"

但还是没有运气......在 API 中,它始终是 00:00:00。

我将不胜感激任何帮助!

UPD 这是我的模型:

public class Alarm
{
    public Guid Id { get; set; } = Guid.NewGuid();
    [...other properties...]       
    public TimeSpan TriggerDelay {get; set;} 
}

我的WebAPI方法:

public async Task<IActionResult> Publish([FromBody] Alarm alarm) {}

这是我的原始 JSON 对象,在 Postman 的请求正文中设置:

{
 "id": "d17ef748-f378-4728-c6c2-9dfab1efce5b",
  [...other properties...]
 "triggerDelay":{
        "hours": "30",
        "minutes": "10",
        "seconds": "0"
    }
}
c# asp.net-core-webapi timespan
1个回答
10
投票

Newtonsoft 的 Json.NET 支持开箱即用的

TimeSpan
序列化/反序列化(如果您决定的话,如何在 ASP.NET Core 3.0 MVC 项目中切换到 Newtonsoft.Json):

public class MyClass { public TimeSpan Interval { get; set; } } var json = @"{ ""Interval"":""00:00:42""}"; Console.WriteLine(JsonConvert.DeserializeObject<MyClass>(json).Interval.TotalSeconds); // prints 42

System.Text.Json

(自 3.0 以来 ASP.NET Core 中的默认 json 处理工具,您似乎正在使用该工具)
目前没有TimeSpan
 的内置支持,因此您需要实现自定义转换器。最简单的一个看起来像这样(从 .NET 6 开始,不需要自定义转换器 - 您可以使用
内置转换器):

public class TimeSpanConverter : System.Text.Json.Serialization.JsonConverter<TimeSpan> { public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return TimeSpan.Parse(reader.GetString()); } public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString()); } }
及用法:

public class MyClass { [System.Text.Json.Serialization.JsonConverterAttribute(typeof(TimeSpanConverter))] public TimeSpan Interval { get; set; } } Console.WriteLine(System.Text.Json.JsonSerializer.Deserialize<MyClass>(json).Interval.TotalSeconds); // prints 42
    
© www.soinside.com 2019 - 2024. All rights reserved.