web-dev-qa-db-ja.com

DateTimeのシリアル化時にJSON.NETにミリ秒を含めるように強制します(msコンポーネントがゼロの場合でも)

JSON.NETを使用して、オブジェクトインスタンスから直接DateTime値をシリアル化しています(フォーマッターでDateTime.ToString()を使用していません)。

DateTimeのミリ秒コンポーネントがゼロの場合でも、シリアル化にJSON.NETに強制的にミリ秒を含める方法はありますか?

背景:このJSONエンドポイントの非常に遅いWebサービスコンシューマーがあります。コンディショナルロジックはコンシューマーにとってコストがかかるため、毎回同じデータフォーマットを提供したいと考えています。

30
Alex

私は現在のプロジェクトで同じ問題に遭遇しました。 Web API(およびJSON.Net)を使用してREST APIを実装しています。DateTimeオブジェクトをシリアル化すると、JSON.Netがミリ秒、またはゼロの場合は完全に日付からミリ秒を省略します。クライアントは、ミリ秒に正確に3桁の固定長の日時文字列を期待していました。Application_Start()で次のように修正しました:

JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings;
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" 
};
settings.Converters.Add(dateConverter);

Web APIを使用していない場合は、JsonSerializerSettingsの新しいインスタンスを作成し、上記のようにIsoDateTimeConverterを追加して、シリアライザ設定をJsonConvert.SerializeObject()

注:DateTimeOffsetまたはローカルDateTimeをシリアル化していて、タイムゾーンオフセットを含める場合は、上記の形式で引用符付きの'Z'を引用符なしのK。詳細については、ドキュメントの カスタムの日付と時刻のフォーマット文字列 を参照してください。

41
Brian Rogers

Javaこの答えを見つけて、そのような.NETのデフォルト形式のタイムスタンプを解析したい人のために、Java 8(Java.time.*)形式を解析する方法:

public static final DateTimeFormatter FORMATTER =
    new DateTimeFormatterBuilder().appendPattern("yyyy-M-d'T'H:m:s")
                                  .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                                  .toFormatter();
...
LocalDateTime ldt = LocalDateTime.parse(dateString, FORMATTER);

これは、期待される小数点としてtrueを使用して、小数ミリ秒の0〜3桁を期待することを示しています。たとえば、「。47」は470ミリ秒と正しく解釈されます。

1
dbreaux