假设我从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; }
}

Csharp相关问答推荐

IComponition.获取IReadOnlyCollection的返回默认属性值

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

Azure DEVOPS找不到定制的Nuget包

实体框架核心中的ComplexType和OwnsOne有什么不同?

如何使用C#获取FireStore中的列表输出文档

为什么C#认为这个非托管 struct 有一个重叠

如何使用.NET6WPF打印车票?

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

使用System.Text.Json进行序列化时发生StackOverflow异常

Google OAuth令牌交换在.Net中不起作用

C#LINQ子字符串

如何在.NET MAUI中最大化GraphicsView的大小?

如何在发布NuGet包之前设置命名空间?

在等待OnGetAsync时打开Razor Page显示微调器

将J数组转换为列表,只保留一个嵌套的JToken

Visual Studio 17.8.0制表符自动完成问题--三缩进

Visual Studio,Docker容器-容器调用:连接被拒绝

如何从SignalR获取连接客户端的域

ASP.NET Core 8 Web API:如何添加版本控制?