@@ -547,19 +547,24 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
547547 // For versions < 3.1, write unevaluatedProperties as an extension
548548 if ( version < OpenApiSpecVersion . OpenApi3_1 )
549549 {
550- // Write UnevaluatedPropertiesSchema as extension if present
551- if ( UnevaluatedPropertiesSchema is not null )
550+ // Only emit unevaluatedProperties when the type could include objects.
551+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
552+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
552553 {
553- writer . WriteOptionalObject (
554- OpenApiConstants . UnevaluatedPropertiesExtension ,
555- UnevaluatedPropertiesSchema ,
556- callback ) ;
557- }
558- // Write boolean false as extension if explicitly set to false
559- else if ( ! UnevaluatedProperties )
560- {
561- writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
562- writer . WriteValue ( false ) ;
554+ // Write UnevaluatedPropertiesSchema as extension if present
555+ if ( UnevaluatedPropertiesSchema is not null )
556+ {
557+ writer . WriteOptionalObject (
558+ OpenApiConstants . UnevaluatedPropertiesExtension ,
559+ UnevaluatedPropertiesSchema ,
560+ callback ) ;
561+ }
562+ // Write boolean false as extension if explicitly set to false
563+ else if ( ! UnevaluatedProperties )
564+ {
565+ writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
566+ writer . WriteValue ( false ) ;
567+ }
563568 }
564569
565570 // Write patternProperties as an extension
@@ -599,19 +604,23 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer)
599604 writer . WriteProperty ( OpenApiConstants . DynamicRef , DynamicRef ) ;
600605 writer . WriteProperty ( OpenApiConstants . DynamicAnchor , DynamicAnchor ) ;
601606
602- // UnevaluatedProperties: similar to AdditionalProperties, serialize as schema if present, else as boolean
603- if ( UnevaluatedPropertiesSchema is not null )
604- {
605- writer . WriteOptionalObject (
606- OpenApiConstants . UnevaluatedProperties ,
607- UnevaluatedPropertiesSchema ,
608- ( w , s ) => s . SerializeAsV31 ( w ) ) ;
609- }
610- else if ( ! UnevaluatedProperties )
607+ // UnevaluatedProperties: similar to AdditionalProperties, serialize as schema if present, else as boolean.
608+ // Only emit when the type could include objects.
609+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
610+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
611611 {
612- writer . WriteProperty ( OpenApiConstants . UnevaluatedProperties , UnevaluatedProperties ) ;
612+ if ( UnevaluatedPropertiesSchema is not null )
613+ {
614+ writer . WriteOptionalObject (
615+ OpenApiConstants . UnevaluatedProperties ,
616+ UnevaluatedPropertiesSchema ,
617+ ( w , s ) => s . SerializeAsV31 ( w ) ) ;
618+ }
619+ else if ( ! UnevaluatedProperties )
620+ {
621+ writer . WriteProperty ( OpenApiConstants . UnevaluatedProperties , UnevaluatedProperties ) ;
622+ }
613623 }
614- // true is the default, no need to write it out
615624 writer . WriteOptionalCollection ( OpenApiConstants . Examples , Examples , ( nodeWriter , s ) => nodeWriter . WriteAny ( s ) ) ;
616625 writer . WriteOptionalMap ( OpenApiConstants . PatternProperties , PatternProperties , ( w , s ) => s . SerializeAsV31 ( w ) ) ;
617626 writer . WriteOptionalMap ( OpenApiConstants . DependentRequired , DependentRequired , ( w , s ) => w . WriteValue ( s ) ) ;
@@ -832,19 +841,24 @@ private void SerializeAsV2(
832841 // x-nullable extension
833842 SerializeNullable ( writer , OpenApiSpecVersion . OpenApi2_0 ) ;
834843
835- // Write UnevaluatedPropertiesSchema as extension if present
836- if ( UnevaluatedPropertiesSchema is not null )
844+ // Write UnevaluatedPropertiesSchema as extension if present.
845+ // Only emit when the type could include objects.
846+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
847+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
837848 {
838- writer . WriteOptionalObject (
839- OpenApiConstants . UnevaluatedPropertiesExtension ,
840- UnevaluatedPropertiesSchema ,
841- ( w , s ) => s . SerializeAsV2 ( w ) ) ;
842- }
843- // Write boolean false as extension if explicitly set to false
844- else if ( ! UnevaluatedProperties )
845- {
846- writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
847- writer . WriteValue ( false ) ;
849+ if ( UnevaluatedPropertiesSchema is not null )
850+ {
851+ writer . WriteOptionalObject (
852+ OpenApiConstants . UnevaluatedPropertiesExtension ,
853+ UnevaluatedPropertiesSchema ,
854+ ( w , s ) => s . SerializeAsV2 ( w ) ) ;
855+ }
856+ // Write boolean false as extension if explicitly set to false
857+ else if ( ! UnevaluatedProperties )
858+ {
859+ writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
860+ writer . WriteValue ( false ) ;
861+ }
848862 }
849863
850864 // Write patternProperties as an extension
0 commit comments