Runtime: System.Text.Json predeterminado DateTimeZoneHandling

Creado en 1 oct. 2019  ·  3Comentarios  ·  Fuente: dotnet/runtime

En JSON.NET puede:

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

¿Hay algo similar en System.Text.Json ?
Si no hay una opción para establecer el valor predeterminado, ¿se puede pasar manualmente?

Además, ¿cuál es el valor predeterminado ( Local , Utc , Unspecified )?

area-System.Text.Json

Comentario más útil

@btecu, desafortunadamente, creo que la única forma de tener la opción similar en System.Text.Json es hacer:

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

e implementar DateTimeConverter así

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"));
    }
}

Todos 3 comentarios

cc @layomia en las fechas

Dado que se puede establecer una fecha y hora en cada uno de esos formatos (por ejemplo, con y sin la zona horaria \ desplazamiento), el lector / escritor (y por lo tanto el serializador) usa lo que está disponible y usa \ asume un formato ISO 8601 para representarlo.

@btecu, el perfil ISO 8601 se utiliza de forma predeterminada en el serializador, por ejemplo, 2019-07-26T16: 59: 57-05: 00.

Para deserializar, si el desplazamiento de fecha y hora se da como "hh: mm", se crea una fecha y hora con DateTimeKind.Local . "Z" dará DateTimeKind.Utc . Si no se proporciona ningún desplazamiento, se crea un DateTime con DateTimeKind.Unspecified .
El mapeo inverso se aplica a la serialización: escribir un DateTime con DateTimeKind.Local producirá una representación ISO con un desplazamiento con formato "hh: mm", y así sucesivamente.

Para obtener más información sobre la compatibilidad con DateTime y DateTimeOffset en System.Text.Json, y cómo puede implementar el análisis o el formato personalizados, consulte https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -apoyo.

@btecu, desafortunadamente, creo que la única forma de tener la opción similar en System.Text.Json es hacer:

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

e implementar DateTimeConverter así

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"));
    }
}
¿Fue útil esta página
0 / 5 - 0 calificaciones