diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs index f2e4aa5a9..f346dddc4 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs @@ -141,9 +141,9 @@ public static void WriteOptionalObject( { if (value != null) { - if (value is IEnumerable values && !values.GetEnumerator().MoveNext()) + if (value is IEnumerable values && value is not JsonArray && !values.GetEnumerator().MoveNext()) { - return; // Don't render optional empty collections + return; // Don't render optional empty collections except for the Default properties which are JsonArray } writer.WriteRequiredObject(name, value, action); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 72fb153dd..c992f6656 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -315,6 +315,40 @@ public void CloningSchemaWithExamplesAndEnumsShouldSucceed() Assert.Equivalent(6, clone.Default.GetValue()); } + [Fact] + public void DefaultEmptyCollectionShouldRoundTrip() + { + // Given + var serializedSchema = + """ + { + "type": "array", + "items": { + "type": "string", + "default": [] + } + } + """; + using var textWriter = new StringWriter(); + var writer = new OpenApiJsonWriter(textWriter); + + // When + var schema = OpenApiModelFactory.Parse(serializedSchema, OpenApiSpecVersion.OpenApi3_1, new(), out _, "json", SettingsFixture.ReaderSettings); + + var deserializedArray = Assert.IsType(schema.Items.Default); + Assert.Empty(deserializedArray); + + schema.SerializeAsV31(writer); + var roundTrippedSchema = textWriter.ToString(); + + // Then + var parsedResult = JsonNode.Parse(roundTrippedSchema); + var parsedExpected = JsonNode.Parse(serializedSchema); + Assert.True(JsonNode.DeepEquals(parsedExpected, parsedResult)); + var resultingArray = Assert.IsType(parsedResult["items"]?["default"]); + Assert.Empty(resultingArray); + } + [Fact] public async Task SerializeV31SchemaWithMultipleTypesAsV3Works() {