2012-09-28 11 views
10

Mam projektu Web API z następującymi ustawieniami w Global.asax.cs:analizowaniem ISO Czas z 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); 

Mimo to, Json.Net nie można analizować ISO durations.

To generuje ten błąd:

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

używam Json.NET V4.5.

Próbowałem różnych wartości, takich jak "P1M" i inne wymienione na stronie wiki bez powodzenia.

Więc pytanie brzmi:

  1. Am I czegoś brakuje?
  2. Czy muszę napisać niestandardowy formater?

Odpowiedz

18

Wpadłem na ten sam problem i używam tego niestandardowego konwertera do konwertowania .NET TimeSpans na ciągi Duration 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?); 
    } 
} 
+0

To jest najlepsze rozwiązanie –

+0

dzięki za to! Wydaje się dziwne, że XmlConvert jest w parserze Json, ale działa dobrze. – Oliver

+0

Tak, naprawdę dziwną rzeczą jest bardzo podobne podejście przy użyciu funkcji Xml, co również jest potrzebne do tego celu w Javie. –