From 4a374da2edb3af23d284a435449151d5974e68f3 Mon Sep 17 00:00:00 2001 From: martincostello Date: Sun, 14 Apr 2024 18:46:11 +0100 Subject: [PATCH] Provide type as hint to JsonSerializer Pass the `Type` value to `JsonSerializer` to give a hint as to how to serialize the value. See https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/2593#issuecomment-1799837881. --- .../JsonSerializerDataContractResolver.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs index 18267a63c6..fd957ce7b4 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/JsonSerializerDataContractResolver.cs @@ -24,16 +24,16 @@ public DataContract GetDataContractForType(Type type) { return DataContract.ForDynamic( underlyingType: type, - jsonConverter: JsonConverterFunc); + jsonConverter: (value) => JsonConverterFunc(value, type)); } - if (PrimitiveTypesAndFormats.TryGetValue(type, out var primitiveTypeAndFormat1)) + if (PrimitiveTypesAndFormats.TryGetValue(type, out var primitiveTypeAndFormat)) { return DataContract.ForPrimitive( underlyingType: type, - dataType: primitiveTypeAndFormat1.Item1, - dataFormat: primitiveTypeAndFormat1.Item2, - jsonConverter: JsonConverterFunc); + dataType: primitiveTypeAndFormat.Item1, + dataFormat: primitiveTypeAndFormat.Item2, + jsonConverter: (value) => JsonConverterFunc(value, type)); } if (type.IsEnum) @@ -42,9 +42,9 @@ public DataContract GetDataContractForType(Type type) //Test to determine if the serializer will treat as string var serializeAsString = (enumValues.Length > 0) - && JsonConverterFunc(enumValues.GetValue(0)).StartsWith("\""); + && JsonConverterFunc(enumValues.GetValue(0), type).StartsWith("\""); - var primitiveTypeAndFormat = serializeAsString + primitiveTypeAndFormat = serializeAsString ? PrimitiveTypesAndFormats[typeof(string)] : PrimitiveTypesAndFormats[type.GetEnumUnderlyingType()]; @@ -52,7 +52,7 @@ public DataContract GetDataContractForType(Type type) underlyingType: type, dataType: primitiveTypeAndFormat.Item1, dataFormat: primitiveTypeAndFormat.Item2, - jsonConverter: JsonConverterFunc); + jsonConverter: (value) => JsonConverterFunc(value, type)); } if (IsSupportedDictionary(type, out Type keyType, out Type valueType)) @@ -61,7 +61,7 @@ public DataContract GetDataContractForType(Type type) underlyingType: type, valueType: valueType, keys: null, // STJ doesn't currently support dictionaries with enum key types - jsonConverter: JsonConverterFunc); + jsonConverter: (value) => JsonConverterFunc(value, type)); } if (IsSupportedCollection(type, out Type itemType)) @@ -69,19 +69,19 @@ public DataContract GetDataContractForType(Type type) return DataContract.ForArray( underlyingType: type, itemType: itemType, - jsonConverter: JsonConverterFunc); + jsonConverter: (value) => JsonConverterFunc(value, type)); } return DataContract.ForObject( underlyingType: type, properties: GetDataPropertiesFor(type, out Type extensionDataType), extensionDataType: extensionDataType, - jsonConverter: JsonConverterFunc); + jsonConverter: (value) => JsonConverterFunc(value, type)); } - private string JsonConverterFunc(object value) + private string JsonConverterFunc(object value, Type type) { - return JsonSerializer.Serialize(value, _serializerOptions); + return JsonSerializer.Serialize(value, type, _serializerOptions); } public bool IsSupportedDictionary(Type type, out Type keyType, out Type valueType)