11

に次の設定の 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 期間を解析できません。

次のエラーがスローされます。

値「2007-03-01T13:00:00Z/2008-05-11T15:30:00Z」を「System.TimeSpan」型に変換中にエラーが発生しました。

Json.Net v4.5 を使用しています。

「P1M」やウィキページにリストされている他の値など、さまざまな値を試しましたが、うまくいきませんでした。

質問は次のとおりです。

  1. 何か不足していますか?
  2. または、カスタム フォーマッタを作成する必要がありますか?
4

1 に答える 1

27

私は同じ問題に遭遇し、現在このカスタム コンバーターを使用して .NET TimeSpans を ISO 8601 Duration 文字列に変換しています。

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?);
    }
}
于 2013-01-07T21:02:44.517 に答える