newtonsoft json序列化时间跨度格式

Mik*_*ail 5 c# serialization json

是否可以指定TimeSpan序列化的自定义格式?用Newtonsoft.Json.

我想要格式化HH:mm的序列化字符串,例如:

TimeSpan.FromHours(5) - > //"+05:00"

TimeSpan.FromHours(-5) - > //" - 05:00"

谢谢!

Tim*_*ace 9

您可以将以下TimeSpan转换器添加到项目中:

using System;
using Newtonsoft.Json;

namespace JsonTools
{
    /// <summary>
    /// TimeSpans are not serialized consistently depending on what properties are present. So this 
    /// serializer will ensure the format is maintained no matter what.
    /// </summary>
    public class TimespanConverter : JsonConverter<TimeSpan>
    {
        /// <summary>
        /// Format: Days.Hours:Minutes:Seconds:Milliseconds
        /// </summary>
        public const string TimeSpanFormatString = @"d\.hh\:mm\:ss\:FFF";

        public override void WriteJson(JsonWriter writer, TimeSpan value, JsonSerializer serializer)
        {
            var timespanFormatted = $"{value.ToString(TimeSpanFormatString)}";
            writer.WriteValue(timespanFormatted);
        }

        public override TimeSpan ReadJson(JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            TimeSpan parsedTimeSpan;
            TimeSpan.TryParseExact((string)reader.Value, TimeSpanFormatString, null, out parsedTimeSpan);
            return parsedTimeSpan;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

public class Schedule
{
    [JsonConverter(typeof(TimespanConverter))]
    [JsonProperty(TypeNameHandling = TypeNameHandling.All)]
    public TimeSpan Delay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. TimeSpan序列化格式参考

  2. 我发现使用Newtonsoft生成架构时,我必须包括TypeNameHandling属性,否则在生成的架构中TimeSpan类型名称未正确序列化。出于此目的,这不是必需的,但无论如何我都将其包括在内。


kiz*_*ziu 5

正如您在源代码中看到的那样,无法使用预定义设置(例如for DateTime)更改格式.

您可以做的是编写一个新的JsonConverterfor TimeSpan并根据需要处理格式.只需确保通过将其包含在内JsonSerializerSettings.Converters或通过修改默认设置来使用它.