diff --git a/GW2SDK.Tests/Features/Hero/Equipment/MailCarriers/MailCarriers.cs b/GW2SDK.Tests/Features/Hero/Equipment/MailCarriers/MailCarriers.cs index e2e55bc08..dd5cbc499 100644 --- a/GW2SDK.Tests/Features/Hero/Equipment/MailCarriers/MailCarriers.cs +++ b/GW2SDK.Tests/Features/Hero/Equipment/MailCarriers/MailCarriers.cs @@ -1,4 +1,6 @@ -using GuildWars2.Tests.TestInfrastructure; +using System.Text.Json; +using GuildWars2.Hero.Equipment.MailCarriers; +using GuildWars2.Tests.TestInfrastructure; namespace GuildWars2.Tests.Features.Hero.Equipment.MailCarriers; @@ -32,6 +34,10 @@ await sut.Hero.Equipment.MailCarriers.GetMailCarriers( Assert.InRange(mailCarrier.Order, 0, 1000); Assert.NotEmpty(mailCarrier.IconHref); Assert.NotEmpty(mailCarrier.Name); + + var json = JsonSerializer.Serialize(mailCarrier); + var roundtrip = JsonSerializer.Deserialize(json); + Assert.Equal(mailCarrier, roundtrip); } ); } diff --git a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrier.cs b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrier.cs index 86829dbcf..40b4aac57 100644 --- a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrier.cs +++ b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrier.cs @@ -1,8 +1,11 @@ -namespace GuildWars2.Hero.Equipment.MailCarriers; +using System.Text.Json.Serialization; + +namespace GuildWars2.Hero.Equipment.MailCarriers; /// Information about a mail carrier. [PublicAPI] [DataTransferObject] +[JsonConverter(typeof(MailCarrierJsonConverter))] public sealed record MailCarrier { /// The mail carrier ID. diff --git a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlags.cs b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlags.cs index b327fa597..740b9f198 100644 --- a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlags.cs +++ b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlags.cs @@ -1,7 +1,10 @@ -namespace GuildWars2.Hero.Equipment.MailCarriers; +using System.Text.Json.Serialization; + +namespace GuildWars2.Hero.Equipment.MailCarriers; /// Modifiers for mail carriers. [PublicAPI] +[JsonConverter(typeof(MailCarrierFlagsJsonConverter))] public sealed record MailCarrierFlags : Flags { /// Whether the mail carrier is the default for new accounts. diff --git a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlagsJsonConverter.cs b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlagsJsonConverter.cs new file mode 100644 index 000000000..b7abf6fac --- /dev/null +++ b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierFlagsJsonConverter.cs @@ -0,0 +1,51 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using GuildWars2.Json; + +namespace GuildWars2.Hero.Equipment.MailCarriers; + +internal sealed class MailCarrierFlagsJsonConverter : JsonConverter +{ + public override MailCarrierFlags? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + using var json = JsonDocument.ParseValue(ref reader); + return Read(json.RootElement); + } + + public override void Write( + Utf8JsonWriter writer, + MailCarrierFlags value, + JsonSerializerOptions options + ) + { + Write(writer, value); + } + + public static MailCarrierFlags Read(JsonElement json) + { + return new MailCarrierFlags + { + Default = json.GetProperty("default").GetBoolean(), + Other = json.GetProperty("other").GetList(static value => value.GetStringRequired()) + }; + } + + public static void Write(Utf8JsonWriter writer, MailCarrierFlags value) + { + writer.WriteStartObject(); + writer.WriteBoolean("default", value.Default); + writer.WritePropertyName("other"); + writer.WriteStartArray(); + foreach (var other in value.Other) + { + writer.WriteStringValue(other); + } + + writer.WriteEndArray(); + writer.WriteEndObject(); + } +} diff --git a/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierJsonConverter.cs b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierJsonConverter.cs new file mode 100644 index 000000000..1941b0530 --- /dev/null +++ b/GW2SDK/Features/Hero/Equipment/MailCarriers/MailCarrierJsonConverter.cs @@ -0,0 +1,54 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using GuildWars2.Json; + +namespace GuildWars2.Hero.Equipment.MailCarriers; + +internal sealed class MailCarrierJsonConverter : JsonConverter +{ + public override MailCarrier? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + using var document = JsonDocument.ParseValue(ref reader); + return Read(document.RootElement); + } + + public static MailCarrier? Read(JsonElement json) + { + return new MailCarrier + { + Id = json.GetProperty("id").GetInt32(), + UnlockItemIds = json.GetProperty("unlock_item_ids").GetList(entry => entry.GetInt32()), + Order = json.GetProperty("order").GetInt32(), + IconHref = json.GetProperty("icon").GetStringRequired(), + Name = json.GetProperty("name").GetStringRequired(), + Flags = MailCarrierFlagsJsonConverter.Read(json.GetProperty("flags")) + }; + } + + public override void Write( + Utf8JsonWriter writer, + MailCarrier value, + JsonSerializerOptions options + ) + { + writer.WriteStartObject(); + writer.WriteNumber("id", value.Id); + writer.WriteStartArray("unlock_item_ids"); + foreach (var itemId in value.UnlockItemIds) + { + writer.WriteNumberValue(itemId); + } + + writer.WriteEndArray(); + writer.WriteNumber("order", value.Order); + writer.WriteString("icon", value.IconHref); + writer.WriteString("name", value.Name); + writer.WritePropertyName("flags"); + MailCarrierFlagsJsonConverter.Write(writer, value.Flags); + writer.WriteEndObject(); + } +}