2012-05-11 25 views
3

私は、Entity Framework 4.1を使用するASP.NET WebApiプロジェクトを持っています。エンティティを返し、JSON.netをデシリアライズに利用しようとしています。すべてがうまくいきますTimeSpanプロパティを持つエンティティを逆シリアル化しようとすると、次の例外が発生します。JSON.netと.net WebApiを使用したTimeSpanの逆シリアル化

System.StringからSystem.TimeSpanにキャストまたは変換できませんでした。スタックトレースを見ると

が明らかになった:

JsonSerializationException:エラー値 "PT17H9M43.1671969Sを" 変換は 'のSystem.TimeSpan' を入力します。パス 'TimeIn'、行1、 位置890

response.Content.ReadAsStringAsync().Resultから出力される。

{ "CreatedDateに": "/日(1329851383157から0500)/"、 "ServicerUserId": 6、 "TimeIn": "PT17H9M43.1671969S"、 "タイムアウト": "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のをデシリアライズする方法上の任意のアイデアをいただければ幸いです。

+0

で参照されるようにGlobal.asaxののApplication_Startイベントでは、デフォルトで直列化のためのJSON.netを活用するWEBAPIプロジェクトを設定するには、あなたの質問がresponse.Contentの値で更新することができました.ReadAsStringAsync()。結果? –

+0

また、サーバーのHttpConfigurationを明示的に表示しないため、既定のフォーマッターを使用していると仮定します。それでも、Json.NETを使用してレスポンスを逆シリアル化する必要があります。理想的には、Json.NETのメディアタイプのフォーマッタを使用し、それを使用するようにサーバを設定し、クライアントが次のようなコンテンツを読むときにそれを使用することを確認します:response.Content.ReadAsAsync (new [] {new JsonNetFormatter()}) 。 –

+0

response.Content.ReadAsStringAsync()のサンプルコンテンツが追加されました。結果 – Jakkwylde

答えて

1

ソリューションはhttp://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-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); 
+2

部分的にしか正しくない独自の回答を受け入れました。あなたの質問に対する本当の答えは、上記の私のコメントにあります。逆シリアル化は、サーバーではなくクライアントによって処理されます。どちらの場合でもJson.NETフォーマッタを使用する必要があります。クライアントはサーバー構成の影響を受けません。 –

関連する問題