使用JSON.Net解析ISO持续时间

时间:2012-09-28 04:29:33

标签: c# asp.net-web-api json.net

我有一个Web API项目,在Global.asax.cs中有以下设置:

var serializerSettings = new JsonSerializerSettings
    {
        DateFormatHandling = DateFormatHandling.IsoDateFormat, 
        DateTimeZoneHandling = DateTimeZoneHandling.Utc
    };

serializerSettings.Converters.Add(new IsoDateTimeConverter());

var jsonFormatter = new JsonMediaTypeFormatter { SerializerSettings = serializerSettings };
jsonFormatter.MediaTypeMappings.Add(GlobalConfiguration.Configuration.Formatters[0].MediaTypeMappings[0]);

GlobalConfiguration.Configuration.Formatters[0] = jsonFormatter;

WebApiConfig.Register(GlobalConfiguration.Configuration);

尽管如此,Json.Net无法解析ISO durations

它抛出了这个错误:

  

将值“2007-03-01T13:00:00Z / 2008-05-11T15:30:00Z”转换为错误   输入'System.TimeSpan'。

我正在使用Json.Net v4.5。

我尝试了不同的值,例如“P1M”以及维基页面上列出的其他值,但没有运气。

所以问题是:

  1. 我错过了什么吗?
  2. 或者我是否必须编写一些自定义格式化程序?

1 个答案:

答案 0 :(得分:21)

我遇到了同样的问题,现在使用这个自定义转换器将.NET TimeSpans转换为ISO 8601持续时间字符串。

public class TimeSpanConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var ts = (TimeSpan) value;
        var tsString = XmlConvert.ToString(ts);
        serializer.Serialize(writer, tsString);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        var value = serializer.Deserialize<String>(reader);
        return XmlConvert.ToTimeSpan(value);
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (TimeSpan) || objectType == typeof (TimeSpan?);
    }
}