2012-09-28 21 views
10

Tengo un proyecto Web API con los siguientes ajustes en Global.asax.cs:de análisis ISO Duración con JSON.Net

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); 

A pesar de todo esto, no se puede analizar Json.Net ISO durations.

que arroja este error:

Error converting value "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z" to type 'System.TimeSpan'.

estoy usando Json.Net v4.5.

He probado diferentes valores como "P1M" y otros listados en la página wiki sin suerte.

Así que la pregunta es:

  1. Me estoy perdiendo algo?
  2. ¿O tengo que escribir algún formateador personalizado?

Respuesta

18

Me encontré con el mismo problema y ahora estoy utilizando este convertidor personalizado para convertir .NET TimeSpans a ISO 8601 Duración de las cadenas.

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?); 
    } 
} 
+0

esta es la mejor solución –

+0

gracias por esto! Se siente un poco raro tener XmlConvert en el analizador Json, pero funciona bien. – Oliver

+0

Sí, lo realmente extraño es un enfoque muy similar al usar funciones Xml, que es también lo que necesita usar para lograr esto en Java también. –