3 // To parse this JSON data, add NuGet 'System.Text.Json' then do:
7 // var particleRoot = ParticleRoot.FromJson(jsonString);
9 #pragma warning disable CS8618
10 #pragma warning disable CS8601
11 #pragma warning disable CS8603
16 using System.Collections.Generic;
18 using System.Text.Json;
19 using System.Text.Json.Serialization;
20 using System.Globalization;
22 public partial class ParticleRoot
24 [JsonPropertyName("format")]
25 public string Format { get; set; }
27 [JsonPropertyName("title")]
28 public string Title { get; set; }
30 [JsonPropertyName("content")]
31 public List<Content> Content { get; set; }
34 public partial class Content
36 [JsonPropertyName("type")]
37 public string Type { get; set; }
39 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
40 [JsonPropertyName("text")]
41 public string Text { get; set; }
43 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
44 [JsonPropertyName("style")]
45 public Style Style { get; set; }
47 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
48 [JsonPropertyName("width")]
49 public long? Width { get; set; }
51 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
52 [JsonPropertyName("height")]
53 public long? Height { get; set; }
55 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
56 [JsonPropertyName("pixels")]
57 public string Pixels { get; set; }
59 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
60 [JsonPropertyName("label")]
61 public string Label { get; set; }
63 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
64 [JsonPropertyName("action")]
65 public string Action { get; set; }
68 public partial class Style
70 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
71 [JsonPropertyName("text-align")]
72 public string TextAlign { get; set; }
74 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
75 [JsonPropertyName("scale")]
76 public long? Scale { get; set; }
79 public partial class ParticleRoot
81 public static ParticleRoot FromJson(string json) => JsonSerializer.Deserialize<ParticleRoot>(json, ParticleGen.Converter.Settings);
84 public static class Serialize
86 public static string ToJson(this ParticleRoot self) => JsonSerializer.Serialize(self, ParticleGen.Converter.Settings);
89 internal static class Converter
91 public static readonly JsonSerializerOptions Settings = new(JsonSerializerDefaults.General)
95 new DateOnlyConverter(),
96 new TimeOnlyConverter(),
97 IsoDateTimeOffsetConverter.Singleton
102 public class DateOnlyConverter : JsonConverter<DateOnly>
104 private readonly string serializationFormat;
105 public DateOnlyConverter() : this(null) { }
107 public DateOnlyConverter(string? serializationFormat)
109 this.serializationFormat = serializationFormat ?? "yyyy-MM-dd";
112 public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
114 var value = reader.GetString();
115 return DateOnly.Parse(value!);
118 public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
119 => writer.WriteStringValue(value.ToString(serializationFormat));
122 public class TimeOnlyConverter : JsonConverter<TimeOnly>
124 private readonly string serializationFormat;
126 public TimeOnlyConverter() : this(null) { }
128 public TimeOnlyConverter(string? serializationFormat)
130 this.serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
133 public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
135 var value = reader.GetString();
136 return TimeOnly.Parse(value!);
139 public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
140 => writer.WriteStringValue(value.ToString(serializationFormat));
143 internal class IsoDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
145 public override bool CanConvert(Type t) => t == typeof(DateTimeOffset);
147 private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
149 private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind;
150 private string? _dateTimeFormat;
151 private CultureInfo? _culture;
153 public DateTimeStyles DateTimeStyles
155 get => _dateTimeStyles;
156 set => _dateTimeStyles = value;
159 public string? DateTimeFormat
161 get => _dateTimeFormat ?? string.Empty;
162 set => _dateTimeFormat = (string.IsNullOrEmpty(value)) ? null : value;
165 public CultureInfo Culture
167 get => _culture ?? CultureInfo.CurrentCulture;
168 set => _culture = value;
171 public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
176 if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
177 || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
179 value = value.ToUniversalTime();
182 text = value.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture);
184 writer.WriteStringValue(text);
187 public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
189 string? dateText = reader.GetString();
191 if (string.IsNullOrEmpty(dateText) == false)
193 if (!string.IsNullOrEmpty(_dateTimeFormat))
195 return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles);
199 return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles);
204 return default(DateTimeOffset);
209 public static readonly IsoDateTimeOffsetConverter Singleton = new IsoDateTimeOffsetConverter();
212 #pragma warning restore CS8618
213 #pragma warning restore CS8601
214 #pragma warning restore CS8603