diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/OpenApiAnyFactory.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/OpenApiAnyFactory.cs index c1cc5f987..b28aa2195 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/OpenApiAnyFactory.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/OpenApiAnyFactory.cs @@ -44,6 +44,9 @@ private static IOpenApiAny CreateOpenApiObject(JsonElement jsonElement) private static IOpenApiAny CreateFromJsonElement(JsonElement jsonElement) { + if (jsonElement.ValueKind == JsonValueKind.Null) + return new OpenApiNull(); + if (jsonElement.ValueKind == JsonValueKind.True || jsonElement.ValueKind == JsonValueKind.False) return new OpenApiBoolean(jsonElement.GetBoolean()); diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsSchemaFilter.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsSchemaFilter.cs index 8acb85550..7683e5174 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsSchemaFilter.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/XmlComments/XmlCommentsSchemaFilter.cs @@ -48,7 +48,7 @@ private void ApplyMemberTags(OpenApiSchema schema, SchemaFilterContext context) var exampleNode = fieldOrPropertyNode.SelectSingleNode("example"); if (exampleNode != null) { - var exampleAsJson = (schema.ResolveType(context.SchemaRepository) == "string") + var exampleAsJson = (schema.ResolveType(context.SchemaRepository) == "string") && !exampleNode.Value.Equals("null") ? $"\"{exampleNode.InnerXml}\"" : exampleNode.InnerXml; diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs index 417a68759..661ee115f 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs @@ -57,6 +57,12 @@ public class XmlAnnotatedType /// d3966535-2637-48fa-b911-e3c27405ee09 public Guid GuidProperty { get; set; } + /// + /// Summary for Nullable StringPropertyWithNullExample + /// + /// null + public string StringPropertyWithNullExample { get; set; } + /// /// Summary for StringProperty /// diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/OpenApiAnyFactoryTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/OpenApiAnyFactoryTests.cs index e43911380..260dc4b20 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/OpenApiAnyFactoryTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/OpenApiAnyFactoryTests.cs @@ -26,6 +26,19 @@ public void CreateFromJson_SimpleType(string json, Type expectedType, object exp Assert.Equal(expectedValue, actualValue); } + [Fact] + public void CreateFromJson_NullType() + { + var expectedType = typeof(OpenApiNull); + + var openApiAnyObject = OpenApiAnyFactory.CreateFromJson("null"); + Assert.NotNull(openApiAnyObject); + Assert.Equal(expectedType, openApiAnyObject.GetType()); + Assert.Equal(AnyType.Null, openApiAnyObject.AnyType); + var valueProperty = expectedType.GetProperty("Value"); + Assert.Null(valueProperty); + } + [Theory] [InlineData("[1,2]", typeof(OpenApiInteger), 1, 2)] [InlineData("[4294877294,4294877295]", typeof(OpenApiLong), 4294877294L, 4294877295L)] diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Swashbuckle.AspNetCore.SwaggerGen.Test.xml b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Swashbuckle.AspNetCore.SwaggerGen.Test.xml index 73191b95c..fa859460e 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Swashbuckle.AspNetCore.SwaggerGen.Test.xml +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/Swashbuckle.AspNetCore.SwaggerGen.Test.xml @@ -127,6 +127,12 @@ d3966535-2637-48fa-b911-e3c27405ee09 + + + Summary for Nullable StringPropertyWithNullExample + + null + Summary for StringProperty diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs index 5a37272fb..6c2c8dcd6 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs @@ -66,6 +66,7 @@ public void Apply_SetsDescription_FromFieldSummaryTag() [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.GuidProperty), "string", "\"d3966535-2637-48fa-b911-e3c27405ee09\"")] [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.StringProperty), "string", "\"Example for StringProperty\"")] [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.ObjectProperty), "object", "{\n \"prop1\": 1,\n \"prop2\": \"foobar\"\n}")] + [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.StringPropertyWithNullExample), "string", "null")] [UseInvariantCulture] public void Apply_SetsExample_FromPropertyExampleTag( Type declaringType,