2016-06-24 3 views
0

:ここJson.NET:オブジェクトをDateTimeOffsetsに変換しますか?私は、次の形式でJSONとして日付を返すAPIサービスへの要求を作ってるんだ

{ 
    "dateCreated": { 
     "date":8, 
     "day":4, 
     "hours":22, 
     "minutes":44, 
     "month":10, 
     "nanos":241000000, 
     "seconds":46, 
     "time":1194590686241, 
     "timezoneOffset":480, 
     "year":107 
    } 
} 

timeはUnixエポックからのミリ秒数であるので、それは本当に私が支払いをしたいだけプロパティですに注意を払う。

public class ApiResponse 
{ 
    public ApiResponse(DateTimeOffset dateCreated) 
    { 
     DateCreated = dateCreated; 
    } 

    public DateTimeOffset DateCreated { get; } 
} 

のようなものにこれをデシリアライズするカスタムJson.NETコンバータ(コンバータは、オブジェクトのtimeプロパティにDateTimeOffset.FromUnixTimeMillisecondsを呼ぶだろう。)

を書き込むことが可能でしょう。ここのコードがあります私がこれまで持っている:

public class ApiDateConverter : JsonConverter 
{ 
    public override bool CanWrite => false; 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(DateTimeOffset) == objectType; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // What type is existingValue here? How do I get existingValue.time? 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotSupportedException(); 
    } 
} 

答えて

1

オプション1

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     dynamic jObject = JObject.Load(reader); 

     return DateTimeOffset.FromUnixTimeMilliseconds(jObject.time.Value); 
    } 

オプション2:あなたのApiDateConverterを完成させることができる

public class DateSerialized 
{ 
    public int date { get; set; } 
    public int day { get; set; } 
    public int hours { get; set; } 
    public int minutes { get; set; } 
    public int month { get; set; } 
    public int nanos { get; set; } 
    public int seconds { get; set; } 
    public long time { get; set; } 
    public int timezoneOffset { get; set; } 
    public int year { get; set; } 
} 

public class ApiResponse 
{ 
    [JsonIgnore] 
    public DateTimeOffset DateCreated => DateTimeOffset.FromUnixTimeMilliseconds(DateSerialized.time); 

    [JsonProperty("dateCreated")] 
    private DateSerialized DateSerialized { get; set; } 
} 
:カスタムコンバータを使用しません
1

それは確かにJson.Neを書くため可能ですtコンバータを使用してJSONを直接ドメインオブジェクトに変換しますが、これはお勧めしません。

代わりに、私はあなたがデータをミラーリングするDTO(データ転送オブジェクト)を作成することをお勧め:

public class DateDto 
{ 
    public long Time { get; set; } 
} 

その後Json.Netは、このオブジェクトにデシリアライズする必要があります。

あなたがいることをしたら、あなたが欲しいDateTimeまたは何構造へDateDtoをマッピングし、純粋なネットコンバータ(あなたがNodaTimeライブラリの代わりに、ネットのDateTimeを使用していることかもしれないと仮定)を作成することができます。

これにより、カスタムデシリアライズロジックを実装する頭痛を払う必要がなくなり、SのSOLID:Single Responsibility Principleに従います。データを表現する目的だけのオブジェクトと、それをアプリケーションが使用するものに変換するコンバータがあります。

また、コードのテスト容易性も向上します。

関連する問題