Skip to content

Commit f471d24

Browse files
committed
Fix JsonUnmappedMemberHandling attribute handling to close #57981
1 parent c68cfd0 commit f471d24

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

src/OpenApi/src/Schemas/OpenApiJsonSchema.Helpers.cs

+5
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ public static void ReadProperty(ref Utf8JsonReader reader, string propertyName,
280280
break;
281281
case OpenApiSchemaKeywords.AdditionalPropertiesKeyword:
282282
reader.Read();
283+
if (reader.TokenType == JsonTokenType.False)
284+
{
285+
schema.AdditionalPropertiesAllowed = false;
286+
break;
287+
}
283288
var additionalPropsConverter = (JsonConverter<OpenApiJsonSchema>)options.GetTypeInfo(typeof(OpenApiJsonSchema)).Converter;
284289
schema.AdditionalProperties = additionalPropsConverter.Read(ref reader, typeof(OpenApiJsonSchema), options)?.Schema;
285290
break;

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiSchemaService/OpenApiSchemaService.RequestBodySchemas.cs

+65
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.ComponentModel;
55
using System.ComponentModel.DataAnnotations;
66
using System.IO.Pipelines;
7+
using System.Text.Json.Serialization;
78
using System.Text.Json.Serialization.Metadata;
89
using Microsoft.AspNetCore.Builder;
910
using Microsoft.AspNetCore.Mvc;
@@ -594,4 +595,68 @@ await VerifyOpenApiDocument(builder, document =>
594595
});
595596
});
596597
}
598+
599+
[Fact]
600+
public async Task SupportsClassWithJsonUnmappedMemberHandlingDisallowed()
601+
{
602+
// Arrange
603+
var builder = CreateBuilder();
604+
605+
// Act
606+
builder.MapPost("/api", (ExampleWithDisallowedUnmappedMembers type) => { });
607+
608+
// Assert
609+
await VerifyOpenApiDocument(builder, document =>
610+
{
611+
var operation = document.Paths["/api"].Operations[OperationType.Post];
612+
var requestBody = operation.RequestBody;
613+
var content = Assert.Single(requestBody.Content);
614+
var schema = content.Value.Schema.GetEffective(document);
615+
Assert.Collection(schema.Properties,
616+
property =>
617+
{
618+
Assert.Equal("number", property.Key);
619+
Assert.Equal("integer", property.Value.Type);
620+
});
621+
Assert.False(schema.AdditionalPropertiesAllowed);
622+
});
623+
}
624+
625+
[Fact]
626+
public async Task SupportsClassWithJsonUnmappedMemberHandlingSkipped()
627+
{
628+
// Arrange
629+
var builder = CreateBuilder();
630+
631+
// Act
632+
builder.MapPost("/api", (ExampleWithSkippedUnmappedMembers type) => { });
633+
634+
// Assert
635+
await VerifyOpenApiDocument(builder, document =>
636+
{
637+
var operation = document.Paths["/api"].Operations[OperationType.Post];
638+
var requestBody = operation.RequestBody;
639+
var content = Assert.Single(requestBody.Content);
640+
var schema = content.Value.Schema.GetEffective(document);
641+
Assert.Collection(schema.Properties,
642+
property =>
643+
{
644+
Assert.Equal("number", property.Key);
645+
Assert.Equal("integer", property.Value.Type);
646+
});
647+
Assert.True(schema.AdditionalPropertiesAllowed);
648+
});
649+
}
650+
651+
[JsonUnmappedMemberHandling(JsonUnmappedMemberHandling.Disallow)]
652+
private class ExampleWithDisallowedUnmappedMembers
653+
{
654+
public int Number { get; init; }
655+
}
656+
657+
[JsonUnmappedMemberHandling(JsonUnmappedMemberHandling.Skip)]
658+
private class ExampleWithSkippedUnmappedMembers
659+
{
660+
public int Number { get; init; }
661+
}
597662
}

0 commit comments

Comments
 (0)