c# - newtonsoft json 序列化时间跨度格式

标签 c# json serialization

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

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

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

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

谢谢!

最佳答案

这是您可以添加到项目中的 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;
        }
    }
}

可以这样使用:

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

注意事项:

  1. Reference for TimeSpan serialization formats

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

关于c# - newtonsoft json 序列化时间跨度格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39876232/

相关文章:

c# - 创建未知类型的实例

python - 从字典列表中创建嵌套的 json 对象

mysql - 如何从 json 数组列中获取具有特定键值的 json 对象?

java - 通过 RPC 的 GWT 序列化

java - Jackson ObjectMapper : Can java. util.Set 按升序序列化为 JSON 数组?

c# - .Net 将对象序列化为自定义 JSON(某种)格式

c# - 我的 Teams 机器人如何启动新的 1 :1 chat with a known user

c# - 为什么我不能在 ListView.SelectedItems 上使用 LINQ?

c# - SQL 阅读器多个结果不返回所有行

Java - 如何进行 JSON 日期验证?