【问题标题】:How to serialize a TimeSpan as "HH:mm:ss" with System.Text.Json.JsonSerializer如何使用 System.Text.Json.JsonSerializer 将 TimeSpan 序列化为“HH:mm:ss”
【发布时间】:2022-02-02 03:22:50
【问题描述】:

我需要序列化一个具有 TimeSpan 属性的对象,并且我需要将该属性序列化为“HH:mm:ss”。相反,我得到以下信息:

{"Ticks":561342005619,"Days":0,"Hours":15,"Milliseconds":200,"Minutes":35,"Seconds":34,"TotalDays":0.6497013953923612,"TotalHours":15.592833489416666,"TotalMilliseconds":56134200.5619,"TotalMinutes":935.570009365,"TotalSeconds":56134.2005619}

有没有办法做到这一点?

【问题讨论】:

标签: c# asp.net-core system.text.json


【解决方案1】:

您可以定义自己的转换器,如How to write custom converters for JSON serialization (marshalling) in .NET 中所述。您的转换器可能如下所示:

public class TimeSpanJsonConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return TimeSpan.ParseExact(reader.GetString() ?? "", @"hh\:mm\:ss", CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, TimeSpan timeSpanValue, JsonSerializerOptions options)
    {
        writer.WriteStringValue(timeSpanValue.ToString(@"hh\:mm\:ss"));
    }
}

然后可以用于序列化和反序列化:

JsonSerializerOptions serializeOptions = new JsonSerializerOptions
{
    Converters =
    {
        new TimeSpanJsonConverter()
    }
};
string serializedString = JsonSerializer.Serialize(
    objectToSerialize, serializeOptions);
MyObject? deserializedObject = JsonSerializer.Deserialize<MyObject>(
    serializedString, serializeOptions);

【讨论】:

  • 我希望有一个“开箱即用”的解决方案。现在,我解决了创建具有字符串而不是 TimeSpan 属性的类似类的问题,因此我将 timeSpan.ToString(@"hh\:mm\:ss") 传递给它。稍后我会试试你的答案。
猜你喜欢
  • 2010-10-12
  • 2011-03-15
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多