ObjectConverter
using System.Runtime.CompilerServices;
using System.Text.Json.Nodes;
namespace System.Text.Json.Serialization.Converters
{
internal sealed class ObjectConverter : JsonConverter<object>
{
internal override ConverterStrategy ConverterStrategy => ConverterStrategy.Object;
public ObjectConverter()
{
base.CanBePolymorphic = true;
base.RequiresReadAhead = true;
}
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (options.UnknownTypeHandling == JsonUnknownTypeHandling.JsonElement)
return JsonElement.ParseValue(ref reader);
return JsonNodeConverter.Instance.Read(ref reader, typeToConvert, options);
}
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteEndObject();
}
internal override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, [System.Runtime.CompilerServices.ScopedRef] ref ReadStack state, out object value)
{
object referenceValue;
if (options.UnknownTypeHandling == JsonUnknownTypeHandling.JsonElement) {
JsonElement jsonElement = JsonElement.ParseValue(ref reader);
if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve && JsonSerializer.TryHandleReferenceFromJsonElement(ref reader, ref state, jsonElement, out referenceValue))
value = referenceValue;
else
value = jsonElement;
return true;
}
JsonNode jsonNode = JsonNodeConverter.Instance.Read(ref reader, typeToConvert, options);
if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve && JsonSerializer.TryHandleReferenceFromJsonNode(ref reader, ref state, jsonNode, out referenceValue))
value = referenceValue;
else
value = jsonNode;
return true;
}
internal override object ReadAsPropertyNameCore(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(TypeToConvert, this);
return null;
}
internal override void WriteAsPropertyNameCore(Utf8JsonWriter writer, object value, JsonSerializerOptions options, bool isWritingExtensionDataProperty)
{
Type type = value.GetType();
JsonConverter converterInternal = options.GetConverterInternal(type);
if (converterInternal == this)
ThrowHelper.ThrowNotSupportedException_DictionaryKeyTypeNotSupported(type, this);
converterInternal.WriteAsPropertyNameCoreAsObject(writer, value, options, isWritingExtensionDataProperty);
}
}
}