假设我从Java中得到了一个持续时间:“PT-328 H-46 M-43.2082074S”。如何在system.text.json中将其转换为NodaTime Duration?
nkhmeac61#
这是Noda Time通常用于 periods 而不是duration的格式。不幸的是,值中存在多个符号意味着您无法使用DurationPattern解析它-但PeriodPattern.NormalizingIso似乎可以正常工作:
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);
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:
System.Text.Json
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);
using NodaTime;
using NodaTime.Serialization.SystemTextJson;
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; }}
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; }
型
1条答案
按热度按时间nkhmeac61#
这是Noda Time通常用于 periods 而不是duration的格式。不幸的是,值中存在多个符号意味着您无法使用
DurationPattern
解析它-但PeriodPattern.NormalizingIso
似乎可以正常工作:字符串
要在
System.Text.Json
中使用它,您需要指定正确的周期模式.然后可能从周期到持续时间进行“蹦床”排序。下面是一个完整的示例:Program.cs:
型
Model.cs:
型