using System.Text.Json; using System.Text.Json.Nodes; namespace RadicadeServer.Extensions { public static class JsonExtension { public static T? FromJson(this string json) { return JsonSerializer.Deserialize(json); } public static T? FromJson(this string json, JsonSerializerOptions options) { return JsonSerializer.Deserialize(json, options); } public static string ToJson(this object val) { return JsonSerializer.Serialize(val); } public static T Get(this JsonNode node, string key, T fallback = default!) { try { var value = node?[key]; if (value is null) return fallback; if (value is JsonArray or JsonObject) return value.Deserialize() ?? fallback; var kind = value.GetValueKind(); if (typeof(T) == typeof(bool)) { if (kind == JsonValueKind.String) { var text = value.GetValue(); return (T)(object)(text == "1" || text.Equals("true", StringComparison.OrdinalIgnoreCase)); } if (kind == JsonValueKind.Number) return (T)(object)(value.GetValue() != 0); } if (typeof(T).IsEnum) { if (kind == JsonValueKind.String) return (T)Enum.Parse(typeof(T), value.GetValue(), ignoreCase: true); if (kind == JsonValueKind.Number) return (T)Enum.ToObject(typeof(T), Convert.ChangeType(value.GetValue(), Enum.GetUnderlyingType(typeof(T)))); } return value.GetValue(); } catch { return fallback; } } } }