Refactor polymorphic JSON deserialization.

Simplify the handling of `JsonNode` parsing and improve type-checking. Added a guard clause in `ReadType` method to handle non-object JSON token types, ensuring safer type parsing.
This commit is contained in:
Sipke Schoorstra 2024-10-10 10:18:27 +02:00
parent 3f83a2fb51
commit 494d6e7f43

View file

@ -93,9 +93,9 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi
if (isDictionary)
{
// Remove the _type property name from the JSON, if any.
var parsedModel = (JsonObject)JsonNode.Parse(ref reader)!;
parsedModel.Remove(TypePropertyName);
return parsedModel.Deserialize(targetType, newOptions)!;
var parsedNode = JsonNode.Parse(ref reader)!;
if (parsedNode is JsonObject parsedModel) parsedModel.Remove(TypePropertyName);
return parsedNode.Deserialize(targetType, newOptions)!;
}
var isCollection = typeof(ICollection).IsAssignableFrom(targetType);
@ -247,7 +247,7 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi
{
var typeOptions = newOptions.Clone();
typeOptions.Converters.RemoveWhere(c => c.GetType() != typeof(TypeJsonConverter));
if (typeOptions.Converters.Any())
{
var typeValue = JsonSerializer.Serialize(type, typeOptions).Trim('"');
@ -265,6 +265,9 @@ public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegi
private Type? ReadType(Utf8JsonReader reader)
{
if (reader.TokenType != JsonTokenType.StartObject)
return null;
reader.Read(); // Move to the first token inside the object.
string? typeName = null;