internal static void CreateExtensionDataProperty( object obj, JsonPropertyInfo jsonPropertyInfo, JsonSerializerOptions options) { Debug.Assert(jsonPropertyInfo != null); object?extensionData = jsonPropertyInfo.GetValueAsObject(obj); if (extensionData == null) { // Create the appropriate dictionary type. We already verified the types. #if DEBUG Type underlyingIDictionaryType = jsonPropertyInfo.PropertyType.GetCompatibleGenericInterface(typeof(IDictionary <,>)) !; Type[] genericArgs = underlyingIDictionaryType.GetGenericArguments(); Debug.Assert(underlyingIDictionaryType.IsGenericType); Debug.Assert(genericArgs.Length == 2); Debug.Assert(genericArgs[0].UnderlyingSystemType == typeof(string)); Debug.Assert( genericArgs[1].UnderlyingSystemType == JsonTypeInfo.ObjectType || genericArgs[1].UnderlyingSystemType == typeof(JsonElement) || genericArgs[1].UnderlyingSystemType == typeof(Nodes.JsonNode)); #endif Func <object>?createObjectForExtensionDataProp = jsonPropertyInfo.JsonTypeInfo.CreateObject ?? jsonPropertyInfo.JsonTypeInfo.CreateObjectForExtensionDataProperty; if (createObjectForExtensionDataProp == null) { // Avoid a reference to the JsonNode type for trimming if (jsonPropertyInfo.PropertyType.FullName == JsonTypeInfo.JsonObjectTypeName) { ThrowHelper.ThrowInvalidOperationException_NodeJsonObjectCustomConverterNotAllowedOnExtensionProperty(); } else { ThrowHelper.ThrowNotSupportedException_SerializationNotSupported(jsonPropertyInfo.PropertyType); } } extensionData = createObjectForExtensionDataProp(); jsonPropertyInfo.SetExtensionDictionaryAsObject(obj, extensionData); } // We don't add the value to the dictionary here because we need to support the read-ahead functionality for Streams. }