From d8b055c178b9915dc8f0467e7d61ce54bedc395c Mon Sep 17 00:00:00 2001 From: Steve Wagner Date: Mon, 26 Apr 2021 09:55:42 +0200 Subject: [PATCH 1/3] add: PolymorphicTypenameConverter class to handle __typename deserialization --- .../PolymorphicTypenameConverter.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs new file mode 100644 index 00000000..c68b2bf4 --- /dev/null +++ b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace GraphQL.Client.Serializer.SystemTextJson +{ + public abstract class PolymorphicTypenameConverter : JsonConverter + { + protected abstract Type Descriminator(string typename); + + public override bool CanConvert(Type typeToConvert) => + typeof(T).IsAssignableFrom(typeToConvert); + + public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var clone = reader; // cause its a struct + + if(clone.TokenType == JsonTokenType.StartObject) + clone.Read(); + if(clone.TokenType != JsonTokenType.PropertyName || clone.GetString() != "__typename") + throw new JsonException(); + + clone.Read(); + var type = Descriminator(clone.GetString()); + object deserialize = JsonSerializer.Deserialize(ref reader, type, options); + return (T)deserialize; + } + + public override void Write(Utf8JsonWriter writer, T obj, JsonSerializerOptions options) => + throw new NotSupportedException(); + } +} From 7ddf3d01e72918608c3917fe4583301283b4e752 Mon Sep 17 00:00:00 2001 From: Steve Wagner Date: Tue, 27 Apr 2021 14:42:13 +0200 Subject: [PATCH 2/3] Update src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs Co-authored-by: Ivan Maximov --- .../PolymorphicTypenameConverter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs index c68b2bf4..f57370bb 100644 --- a/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs +++ b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs @@ -15,9 +15,10 @@ public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerial { var clone = reader; // cause its a struct - if(clone.TokenType == JsonTokenType.StartObject) + if (clone.TokenType == JsonTokenType.StartObject) clone.Read(); - if(clone.TokenType != JsonTokenType.PropertyName || clone.GetString() != "__typename") + if (clone.TokenType != JsonTokenType.PropertyName || clone.GetString() != "__typename") + throw new JsonException(); clone.Read(); From 574e24c2102be8a0f47d8b6f4fbb7b9629662b56 Mon Sep 17 00:00:00 2001 From: Steve Wagner Date: Mon, 29 Aug 2022 12:20:15 +0200 Subject: [PATCH 3/3] Update src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs Co-authored-by: Alexander Rose --- .../PolymorphicTypenameConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs index f57370bb..674e4926 100644 --- a/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs +++ b/src/GraphQL.Client.Serializer.SystemTextJson/PolymorphicTypenameConverter.cs @@ -6,7 +6,7 @@ namespace GraphQL.Client.Serializer.SystemTextJson { public abstract class PolymorphicTypenameConverter : JsonConverter { - protected abstract Type Descriminator(string typename); + protected abstract Type GetTypeFromTypenameField(string typename); public override bool CanConvert(Type typeToConvert) => typeof(T).IsAssignableFrom(typeToConvert);