using System; using System.Text.Json; using System.Text.Json.Serialization; namespace Deploymentcenter.Client.Models { /// /// Liest Wahrheitswerte, die nicht als JSON-Boolean ankommen. /// /// Die Deploymentcenter-API reicht Release-Zeilen unveraendert aus MySQL /// durch. is_critical ist dort TINYINT(1) und erscheint je nach /// PDO-Einstellung als 1, "1" oder true. Der Standardkonverter von /// System.Text.Json wirft bei allem ausser true/false - und der Fehler /// haette den gesamten Release-Datensatz unbrauchbar gemacht. /// public class FlexibleBoolConverter : JsonConverter { public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { switch (reader.TokenType) { case JsonTokenType.True: return true; case JsonTokenType.False: case JsonTokenType.Null: return false; case JsonTokenType.Number: return reader.TryGetInt64(out long number) ? number != 0 : reader.GetDouble() != 0d; case JsonTokenType.String: string? value = reader.GetString(); if (string.IsNullOrWhiteSpace(value)) return false; value = value!.Trim(); if (bool.TryParse(value, out bool parsed)) return parsed; if (long.TryParse(value, out long numeric)) return numeric != 0; return value.Equals("yes", StringComparison.OrdinalIgnoreCase) || value.Equals("on", StringComparison.OrdinalIgnoreCase); default: return false; } } public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { writer.WriteBooleanValue(value); } } }