ファイル - c# json 読み込み



DateTimeをシリアル化するときにJSON.NETにミリ秒を含める(msコンポーネントがゼロの場合でも) (2)

この答えを見つけて、そのような.NETのデフォルト書式のタイムスタンプを解析したいと思うJavaの人々にとっては、書式を解析するためのJava 8( java.time.* )アプローチに注意したいと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);

これは、0-3桁の小数点以下のミリ秒を期待し、期待される小数点のtrueとなりtrue 。 例えば、「.47」は470ミリ秒と正しく解釈されます。

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

DateTimeのミリ秒のコンポーネントがゼロであってもJSON.NETにミリ秒をシリアル化するように強制する方法はありますか?

背景:JSONエンドポイントのWebサービスコンシューマーが非常に遅いです。 条件付きロジックは消費者にとって高価なので、毎回同じデータフォーマットを提供したいと思います。


Answer #1

私は私の現在のプロジェクトでこの同じ問題に遭遇しました。 私たちは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に置き換えます。 詳細については、ドキュメントの「 カスタム日付と時刻の書式文字列 」を参照してください。





json.net