2016-03-26 10 views
3

私は実際にWeb APIに新しいので、私の質問はちょっと奇妙に聞こえるかもしれません。Web Api 2 - カスタムデータ型JSONのシリアル化

価格変更に関する履歴情報を返す簡単なAPIがあります。アクションは、次の形式で

[{"Date":"2016-02-07T08:22:46.212Z","Value":17.48},{"Date":"2016-02-08T09:34:01.212Z","Value":18.37}] 

しかし、特定のクライアントの要件によるとJSONを返します - しかし、問題があるPriceHistoryRecordModelが

[DataContract] 
public class PriceHistoryRecordModel 
{ 
    [DataMember] 
    public DateTime Date { get; set; } 

    [DataMember] 
    public double Value { get; set; } 
} 

ある

[HttpGet] 
[Route("api/history/{id}/{size}")] 
public async Task<IEnumerable<PriceHistoryRecordModel>> GetHistory(string id, Size size) 

:私のコントローラのアクションは、次のようになりますデータ形式に変換するには、このようにJSONが必要です

[[1238371200000,17.48],[1238457600000,18.37]] 

、カスタムのシリアル化を達成するための方法がありますのであれば、私は

  • をだろうか?
  • このカスタムシリアル化を属性にラップし、それをアスペクトとして使用できますか?
+1

を使って、数にあなたの日時をひそかにし、あなたの戻り値の型を変更してみてください'double []': 'public async Task > GetHistory(文字列ID、サイズサイズ)'。 'DateTime.Millisecond'を使ってdatetimeを数値に変換してください –

+0

@KhanhTOありがとうございました。それはすぐに問題を解決し解決しました。しかし、カスタムシリアル化に関する質問はそのままです。 –

答えて

3

あなたはこのようCustomConverterを書くことができます:それは作品

[JsonConverter(typeof(CustomCoverter))] 
[DataContract] 
public class PriceHistoryRecordModel 
{ 
    [DataMember] 
    public DateTime Date { get; set; } 

    [DataMember] 
    public double Value { get; set; } 
} 

、しかし、あなただけが必要な場合、それは一種のオーバーヘッドです:

public class CustomCoverter : JsonConverter 
    { 
     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      PriceHistoryRecordModel obj = value as PriceHistoryRecordModel; 
      JToken t = JToken.FromObject(new double[] { obj.Date.Ticks, obj.Value }); 
      t.WriteTo(writer); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool CanConvert(Type objectType) 
     { 
      return typeof(PriceHistoryRecordModel).IsAssignableFrom(objectType); 
     } 
    } 

は、私たちのクラスは、このコンバータによってシリアライズされていることを指定しますこの特別な場合のこの特別扱い。

このようなケースが多い場合は、クラスに基本クラスを実装して、これらのクラスすべてにこのコンバータを使用させることができます。この単純なケースで

、迅速な解決がちょうどあなたの戻り値の型がdouble[]に変更することです:

public async Task<IEnumerable<double[]>> GetHistory(string id, Size size)

そしてDateTime.Ticks

関連する問題