如何在c#中反序列化java持续时间?

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

假设我从Java获得了一个持续时间:“PT-328H-46M-43.2082074S”。 如何将其反序列化为system.text.json中的NodaTime Duration?

c# .net system.text.json nodatime
1个回答
2
投票

这是 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; } }

© www.soinside.com 2019 - 2024. All rights reserved.