In JSON.NET können Sie:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
Gibt es etwas Ähnliches in System.Text.Json
?
Wenn es keine Option zum Festlegen des Standardwerts gibt, kann er dann manuell übergeben werden?
Und was ist die Standardeinstellung ( Local
, Utc
, Unspecified
)?
cc @layomia bei Dates
Da in jedem dieser Formate eine DateTime gesetzt werden kann (zB mit und ohne Zeitzone\Offset), verwendet der Reader\Writer (und damit der Serializer) das, was verfügbar ist, und verwendet ein ISO 8601-Format, um dies darzustellen.
@btecu das ISO 8601-Profil wird standardmäßig im Serializer verwendet, z. B. 2019-07-26T16:59:57-05:00.
Für die Deserialisierung wird, wenn der Datetime-Offset als "hh:mm" angegeben wird, eine DateTime mit DateTimeKind.Local
erstellt. "Z" ergibt DateTimeKind.Utc
. Wenn kein Offset angegeben ist, wird eine DateTime mit DateTimeKind.Unspecified
erstellt.
Die umgekehrte Zuordnung gilt für die Serialisierung: Schreiben eines DateTime
mit DateTimeKind.Local
ergibt eine ISO-Darstellung mit einem "hh:mm"-formatierten Offset und so weiter.
Weitere Informationen zur Unterstützung von DateTime und DateTimeOffset in System.Text.Json und zur Implementierung von benutzerdefinierter Analyse oder Formatierung finden Sie unter https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -Unterstützung.
@btecu leider ist die einzige Möglichkeit, die ähnliche Option in System.Text.Json
zu haben, meiner Meinung nach, Folgendes zu tun:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
und implementiere DateTimeConverter so
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"));
}
}
Hilfreichster Kommentar
@btecu leider ist die einzige Möglichkeit, die ähnliche Option in
System.Text.Json
zu haben, meiner Meinung nach, Folgendes zu tun:und implementiere DateTimeConverter so