将具有 TimeSpan 属性 的 JSON 对象传递给 C# WebAPI
Pass JSON object with a TimeSpan property to C# WebAPI
我有一个 WebAPI(用 C# 编写),一个 POST 方法接受一个名为 System.TimeSpan-属性 的复杂对象 TriggerDelay,以及我以 JSON 格式传递此对象的 React Native 应用程序。
但是,这个 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;}
}
我的网站API方法:
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"
}
}
Newtonsoft 的 Json.NET 支持开箱即用的 TimeSpan
serialization/deserializion(how to switch to Newtonsoft.Json in an ASP.NET Core 3.0 MVC project 如果您决定):
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
(ASP.NET Core 中的默认 json 处理工具,自 3.0 以来,您似乎正在使用它)does not have built-in 支持TimeSpan
目前,您需要实施自定义转换器。最简单的看起来像这样:
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
我有一个 WebAPI(用 C# 编写),一个 POST 方法接受一个名为 System.TimeSpan-属性 的复杂对象 TriggerDelay,以及我以 JSON 格式传递此对象的 React Native 应用程序。
但是,这个 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;}
}
我的网站API方法:
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"
}
}
Newtonsoft 的 Json.NET 支持开箱即用的 TimeSpan
serialization/deserializion(how to switch to Newtonsoft.Json in an ASP.NET Core 3.0 MVC project 如果您决定):
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
(ASP.NET Core 中的默认 json 处理工具,自 3.0 以来,您似乎正在使用它)does not have built-in 支持TimeSpan
目前,您需要实施自定义转换器。最简单的看起来像这样:
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