JSON.NETを使用して、オブジェクトインスタンスから直接DateTime値をシリアル化しています(フォーマッターでDateTime.ToString()を使用していません)。
DateTimeのミリ秒コンポーネントがゼロの場合でも、シリアル化にJSON.NETに強制的にミリ秒を含める方法はありますか?
背景:このJSONエンドポイントの非常に遅いWebサービスコンシューマーがあります。コンディショナルロジックはコンシューマーにとってコストがかかるため、毎回同じデータフォーマットを提供したいと考えています。
私は現在のプロジェクトで同じ問題に遭遇しました。 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
。詳細については、ドキュメントの カスタムの日付と時刻のフォーマット文字列 を参照してください。
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ミリ秒と正しく解釈されます。