假设我从Java获得了一个持续时间:“PT-328H-46M-43.2082074S”。 如何将其反序列化为system.text.json中的NodaTime Duration?
这是 Noda Time 通常用于表示“期间”而不是持续时间的格式。不幸的是,值中存在多个符号意味着您无法使用 DurationPattern
解析它 - 但
PeriodPattern.NormalizingIso
似乎可以正常工作:
using NodaTime.Text;
var pattern = PeriodPattern.NormalizingIso;
var result = pattern.Parse("PT-328H-46M-43.2082074S");
var period = result.Value;
var duration = period.ToDuration();
Console.WriteLine(duration);
要在
System.Text.Json
内使用它,您需要指定正确的周期模式...然后可能从周期到持续时间进行“蹦床”排序。这是一个完整的例子:
程序.cs:using NodaTime;
using NodaTime.Serialization.SystemTextJson;
using NodaTime.Text;
using System.Text.Json;
string json = """
{
"name": "Jon",
"duration": "PT-328H-46M-43.2082074S"
}
""";
var settings = new NodaJsonSettings
{
PeriodConverter = new NodaPatternConverter<Period>(PeriodPattern.NormalizingIso)
};
var options = new JsonSerializerOptions().ConfigureForNodaTime(settings);
var model = JsonSerializer.Deserialize<Model>(json, options);
Console.WriteLine(model.Duration);
模型.cs:
using NodaTime;
using System.Text.Json.Serialization;
public class Model
{
[JsonPropertyName("name")]
public string Name { get; set; }
[Obsolete]
[JsonPropertyName("duration")]
public Period Period
{
// TODO: A getter, if you want to be able to serialize back.
// That's a little more work as there isn't a Duration.ToPeriod conversion.
set => Duration = value.ToDuration();
}
[JsonIgnore]
public Duration Duration { get; set; }
}