// // // To parse this JSON data, add NuGet 'System.Text.Json' then do: // // using ParticleGen; // // var particleRoot = ParticleRoot.FromJson(jsonString); #nullable enable #pragma warning disable CS8618 #pragma warning disable CS8601 #pragma warning disable CS8603 namespace ParticleGen { using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; using System.Globalization; public partial class ParticleRoot { [JsonPropertyName("format")] public string Format { get; set; } [JsonPropertyName("title")] public string Title { get; set; } [JsonPropertyName("content")] public List Content { get; set; } } public partial class Content { [JsonPropertyName("type")] public string Type { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("text")] public string Text { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("style")] public Style Style { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("width")] public long? Width { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("height")] public long? Height { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("pixels")] public string Pixels { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("label")] public string Label { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("action")] public string Action { get; set; } } public partial class Style { [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("text-align")] public string TextAlign { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonPropertyName("scale")] public long? Scale { get; set; } } public partial class ParticleRoot { public static ParticleRoot FromJson(string json) => JsonSerializer.Deserialize(json, ParticleGen.Converter.Settings); } public static class Serialize { public static string ToJson(this ParticleRoot self) => JsonSerializer.Serialize(self, ParticleGen.Converter.Settings); } internal static class Converter { public static readonly JsonSerializerOptions Settings = new(JsonSerializerDefaults.General) { Converters = { new DateOnlyConverter(), new TimeOnlyConverter(), IsoDateTimeOffsetConverter.Singleton }, }; } public class DateOnlyConverter : JsonConverter { private readonly string serializationFormat; public DateOnlyConverter() : this(null) { } public DateOnlyConverter(string? serializationFormat) { this.serializationFormat = serializationFormat ?? "yyyy-MM-dd"; } public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); return DateOnly.Parse(value!); } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString(serializationFormat)); } public class TimeOnlyConverter : JsonConverter { private readonly string serializationFormat; public TimeOnlyConverter() : this(null) { } public TimeOnlyConverter(string? serializationFormat) { this.serializationFormat = serializationFormat ?? "HH:mm:ss.fff"; } public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); return TimeOnly.Parse(value!); } public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString(serializationFormat)); } internal class IsoDateTimeOffsetConverter : JsonConverter { public override bool CanConvert(Type t) => t == typeof(DateTimeOffset); private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; private string? _dateTimeFormat; private CultureInfo? _culture; public DateTimeStyles DateTimeStyles { get => _dateTimeStyles; set => _dateTimeStyles = value; } public string? DateTimeFormat { get => _dateTimeFormat ?? string.Empty; set => _dateTimeFormat = (string.IsNullOrEmpty(value)) ? null : value; } public CultureInfo Culture { get => _culture ?? CultureInfo.CurrentCulture; set => _culture = value; } public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) { string text; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) { value = value.ToUniversalTime(); } text = value.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); writer.WriteStringValue(text); } public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { string? dateText = reader.GetString(); if (string.IsNullOrEmpty(dateText) == false) { if (!string.IsNullOrEmpty(_dateTimeFormat)) { return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles); } else { return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles); } } else { return default(DateTimeOffset); } } public static readonly IsoDateTimeOffsetConverter Singleton = new IsoDateTimeOffsetConverter(); } } #pragma warning restore CS8618 #pragma warning restore CS8601 #pragma warning restore CS8603