Runtime: System.Text.JsonのデフォルトのDateTimeZoneHandling

作成日 2019年10月01日  ·  3コメント  ·  ソース: dotnet/runtime

JSON.NETでは、次のことができます。

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

System.Text.Json似たようなものはありますか?
デフォルトを設定するオプションがない場合、手動で渡すことはできますか?

また、デフォルトは何ですか( LocalUtcUnspecified )?

area-System.Text.Json

最も参考になるコメント

@btecu残念ながら、 System.Text.Json同様のオプションを使用する唯一の方法は、次のことを行うことだと思います。

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

そしてそのようなDateTimeConverterを実装します

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}

全てのコメント3件

日付のcc @ layomia

DateTimeはこれらの各形式(たとえば、タイムゾーン\オフセットの有無にかかわらず)で設定できるため、リーダー\ライター(したがってシリアライザー)は使用可能なものを使用し、それを表すためにISO8601形式を使用/想定します。

@btecu ISO 8601プロファイルは、

デシリアライズの場合、日時オフセットが「hh:mm」として指定されていると、 DateTimeKind.Local DateTimeが作成されます。 「Z」はDateTimeKind.Utcを与えます。 オフセットが指定されていない場合、 DateTimeKind.Unspecified DateTimeが作成されます。
逆マッピングはシリアル化に適用されます。 DateTimeDateTimeKind.Local書き込むと、「hh:mm」形式のオフセットを持つISO表現が生成されます。

System.Text.JsonでのDateTimeとDateTimeOffsetのサポート、およびカスタムの解析またはフォーマットを実装する方法の詳細については、 https: //docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-jsonを参照して

@btecu残念ながら、 System.Text.Json同様のオプションを使用する唯一の方法は、次のことを行うことだと思います。

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

そしてそのようなDateTimeConverterを実装します

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}
このページは役に立ちましたか?
0 / 5 - 0 評価