假设我从Java获得了一个持续时间:"PT-328H-46M-43.2082074S". 如何将其反序列化为Syst.ext.json中的NodaTime持续时间?
假设我从Java获得了一个持续时间:"PT-328H-46M-43.2082074S". 如何将其反序列化为Syst.ext.json中的NodaTime持续时间?
这是Noda Time通常用于periods而不是持续时间的格式.遗憾的是,该值中存在多个符号,这意味着您不能使用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
以内使用它,您需要指定正确的句号模式...然后潜在地从一段时间到整个持续时间都是一种"蹦床".下面是一个完整的例子:
Program.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);
Model.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; }
}