2016-05-19 16 views
2

日付を受け取るASP.NET Web API 2でRESTエンドポイントを作成しました。バックエンドシステムにはUTC時間またはDSTの概念がないため、データベースに格納された日付は英国の日時にすぎません。Json.NETでデシリアライズするときにUTCオフセットを無視する

ただし、エンドポイントに送るウェブサイトには、エンドポイントに送信されるデータにUTCオフセット値が含まれています(たとえば、日付は「1939-01-08T00:00:00 + 01:00」のように見えます)。これは、(DSTの調整のために)冬に夏の日付を入力した場合、またはその逆の場合に発生します。

JSONデシリアライザでUTCオフセット値を完全に無視するよう設定することはできますか?私はhereの文書とhereという例を見てきましたが、すべての異なるenumオプションを試しましたが、私が探している振る舞いを与えるものはありません。

答えて

0

日付解析がうまく動作しない場合は、日付解析をオフにして、代わりにカスタムJsonConverterを使用して日付を処理できます。ここで

は仕事をしなければならないコンバータです:Web APIをパイプラインにこのコンバーターをインストールするには

class OffsetIgnoringDateConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(DateTime) || objectType == typeof(DateTime?)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     string rawDate = (string)reader.Value; 
     if (rawDate == null) return existingValue; 
     if (rawDate.Length > 19) rawDate = rawDate.Substring(0, 19); 
     DateTime date = DateTime.ParseExact(rawDate, "yyyy'-'MM'-'dd'T'HH':'mm':'ss", 
           CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal); 
     return date; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

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

Global.asaxであなたのApplication_Start()メソッドに次の行を追加します。

var config = GlobalConfiguration.Configuration; 
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.DateParseHandling = DateParseHandling.None; 
jsonSettings.Converters.Add(new OffsetIgnoringDateConverter()); 

ここれますデモ(コンソールアプリ):https://dotnetfiddle.net/kt9pFl

関連する問題