From 3da6822223dda4515a066f7e4258c22b5254173c Mon Sep 17 00:00:00 2001 From: "e.kent" Date: Fri, 11 Apr 2025 10:27:59 +1000 Subject: [PATCH 1/4] Update to fix Lists/Arrays of nullables not getting marked as nullable --- .../SchemaGenerator/SchemaGenerator.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs index a9cd594e0b..6113cba73c 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs @@ -183,6 +183,8 @@ private OpenApiSchema GenerateSchemaForType(Type modelType, SchemaRepository sch if (schema.Reference == null) { ApplyFilters(schema, modelType, schemaRepository); + if (Nullable.GetUnderlyingType(modelType) != null) + schema.Nullable = true; } return schema; From 7027900c4a875e104f36f005afd24cdc3ff8e5aa Mon Sep 17 00:00:00 2001 From: "e.kent" Date: Fri, 11 Apr 2025 11:40:57 +1000 Subject: [PATCH 2/4] Updated unit test to cover whether items in a array are correctly marked as nullable or not --- .../JsonSerializerSchemaGeneratorTests.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs index a064b0fdb5..443393eab2 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs @@ -161,13 +161,13 @@ public void GenerateSchema_GeneratesReferencedDictionarySchema_IfDictionaryTypeI Assert.Equal(schema.AdditionalProperties.Reference.Id, referenceSchema.Reference.Id); // ref to self } - public static TheoryData EnumerableTypeData => new() + public static TheoryData EnumerableTypeData => new() { - { typeof(int[]), JsonSchemaTypes.Integer, "int32" }, - { typeof(IEnumerable), JsonSchemaTypes.String, null }, - { typeof(DateTime?[]), JsonSchemaTypes.String, "date-time" }, - { typeof(int[][]), JsonSchemaTypes.Array, null }, - { typeof(IList), null, null }, + { typeof(int[]), JsonSchemaTypes.Integer, "int32", false }, + { typeof(IEnumerable), JsonSchemaTypes.String, null, false }, + { typeof(DateTime?[]), JsonSchemaTypes.String, "date-time", true }, + { typeof(int[][]), JsonSchemaTypes.Array, null, false }, + { typeof(IList), null, null, false }, }; [Theory] @@ -175,7 +175,8 @@ public void GenerateSchema_GeneratesReferencedDictionarySchema_IfDictionaryTypeI public void GenerateSchema_GeneratesArraySchema_IfEnumerableType( Type type, JsonSchemaType expectedItemsType, - string expectedItemsFormat) + string expectedItemsFormat, + bool expectedItemsNullable) { var schema = Subject().GenerateSchema(type, new SchemaRepository()); @@ -183,6 +184,7 @@ public void GenerateSchema_GeneratesArraySchema_IfEnumerableType( Assert.NotNull(schema.Items); Assert.Equal(expectedItemsType, schema.Items.Type); Assert.Equal(expectedItemsFormat, schema.Items.Format); + Assert.Equal(expectedItemsNullable, schema.Items.Nullable); } [Theory] From 3327490253099e2d590e1d859948d56c0d469e04 Mon Sep 17 00:00:00 2001 From: Scarecrow7250 <139413067+Scarecrow7250@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:45:01 +1000 Subject: [PATCH 3/4] Update src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs Co-authored-by: Martin Costello --- .../SchemaGenerator/SchemaGenerator.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs index 6113cba73c..1135f91e4e 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs @@ -184,7 +184,9 @@ private OpenApiSchema GenerateSchemaForType(Type modelType, SchemaRepository sch { ApplyFilters(schema, modelType, schemaRepository); if (Nullable.GetUnderlyingType(modelType) != null) + { schema.Nullable = true; + } } return schema; From 36f4b935c2747ec6f9def3845fe3b984b86ca7ba Mon Sep 17 00:00:00 2001 From: "e.kent" Date: Mon, 14 Apr 2025 10:04:43 +1000 Subject: [PATCH 4/4] Added some more test cases to unit tests --- .../SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs index 443393eab2..c424c7d484 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs @@ -164,8 +164,12 @@ public void GenerateSchema_GeneratesReferencedDictionarySchema_IfDictionaryTypeI public static TheoryData EnumerableTypeData => new() { { typeof(int[]), JsonSchemaTypes.Integer, "int32", false }, - { typeof(IEnumerable), JsonSchemaTypes.String, null, false }, + { typeof(int?[]), JsonSchemaTypes.Integer, "int32", true }, + { typeof(double[]), JsonSchemaTypes.Number, "double", false }, + { typeof(double?[]), JsonSchemaTypes.Number, "double", true }, + { typeof(DateTime[]), JsonSchemaTypes.String, "date-time", false }, { typeof(DateTime?[]), JsonSchemaTypes.String, "date-time", true }, + { typeof(IEnumerable), JsonSchemaTypes.String, null, false }, { typeof(int[][]), JsonSchemaTypes.Array, null, false }, { typeof(IList), null, null, false }, };