6

Entity Framework 4.1 を利用する ASP.NET WebApi プロジェクトがあります。エンティティを返そうとしていますが、JSON.net を逆シリアル化に利用しています。すべてがうまく機能していますが、TimeSpan プロパティを使用してエンティティを逆シリアル化しようとすると、次の例外が発生します。

System.String から System.TimeSpan にキャストまたは変換できませんでした。

スタック トレースを見ると、次のことがわかります。

JsonSerializationException: 値「PT17H9M43.1671969S」を「System.TimeSpan」型に変換中にエラーが発生しました。パス「TimeIn」、1 行目、位置 890。

からの出力response.Content.ReadAsStringAsync().Resultは次のとおりです。

{"CreatedDate":"/Date(1329851383157-0500)/","ServicerUserId":6,"TimeIn":"PT17H9M43.1671969S","TimeOut":"PT17H28M43.1671969S"}

JSON.net を使用する前に、使用してデシリアライズに成功しましたSystem.Runtime.Serialization.JsonDataContractJsonSerializerが、このアプローチを使用しないことをお勧めします。

WebApi からエンティティを取得するために使用されるコード

public T Get<T>(object id)
{
    using (var httpClient = NewHttpClient())
    {
        var response = httpClient.GetAsync(_endpoint + id.ToString()).Result;
        return JsonConvert.DeserializeObject<T>(response.Content.ReadAsStringAsync().Result);
    }
}

エンティティを返すために WebApi コントローラーで使用されるコード:

// GET /api/services/5
public Service Get(Guid id)
{
    var entry = db.Services.Find(id);
    if (entry == null)
        throw new HttpResponseException(HttpStatusCode.NotFound);
    return entry;
}

TimeSpan を逆シリアル化する方法についてのアイデアは大歓迎です。

4

1 に答える 1

2

解決策は、 http: //blogs.msdn.com/b/henrikn/archive/2012/02/18/using で参照されているように、global.asax Application_Start イベントでデフォルトでシリアル化に JSON.net を利用するように WebApi プロジェクトを構成することでした。-json-net-with-asp-net-web-api.aspx

 // Create Json.Net formatter serializing DateTime using the ISO 8601 format
            JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
            serializerSettings.Converters.Add(new IsoDateTimeConverter());
            GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);
于 2012-05-23T20:17:22.323 に答える