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:
parent
3f83a2fb51
commit
494d6e7f43
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue