@@ -542,19 +542,24 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
542542 // For versions < 3.1, write unevaluatedProperties as an extension
543543 if ( version < OpenApiSpecVersion . OpenApi3_1 )
544544 {
545- // Write UnevaluatedPropertiesSchema as extension if present
546- if ( UnevaluatedPropertiesSchema is not null )
545+ // Only emit unevaluatedProperties when the type could include objects.
546+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
547+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
547548 {
548- writer . WriteOptionalObject (
549- OpenApiConstants . UnevaluatedPropertiesExtension ,
550- UnevaluatedPropertiesSchema ,
551- callback ) ;
552- }
553- // Write boolean false as extension if explicitly set to false
554- else if ( ! UnevaluatedProperties )
555- {
556- writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
557- writer . WriteValue ( false ) ;
549+ // Write UnevaluatedPropertiesSchema as extension if present
550+ if ( UnevaluatedPropertiesSchema is not null )
551+ {
552+ writer . WriteOptionalObject (
553+ OpenApiConstants . UnevaluatedPropertiesExtension ,
554+ UnevaluatedPropertiesSchema ,
555+ callback ) ;
556+ }
557+ // Write boolean false as extension if explicitly set to false
558+ else if ( ! UnevaluatedProperties )
559+ {
560+ writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
561+ writer . WriteValue ( false ) ;
562+ }
558563 }
559564
560565 // Write patternProperties as an extension
@@ -594,19 +599,23 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer)
594599 writer . WriteProperty ( OpenApiConstants . DynamicRef , DynamicRef ) ;
595600 writer . WriteProperty ( OpenApiConstants . DynamicAnchor , DynamicAnchor ) ;
596601
597- // UnevaluatedProperties: similar to AdditionalProperties, serialize as schema if present, else as boolean
598- if ( UnevaluatedPropertiesSchema is not null )
599- {
600- writer . WriteOptionalObject (
601- OpenApiConstants . UnevaluatedProperties ,
602- UnevaluatedPropertiesSchema ,
603- ( w , s ) => s . SerializeAsV31 ( w ) ) ;
604- }
605- else if ( ! UnevaluatedProperties )
602+ // UnevaluatedProperties: similar to AdditionalProperties, serialize as schema if present, else as boolean.
603+ // Only emit when the type could include objects.
604+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
605+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
606606 {
607- writer . WriteProperty ( OpenApiConstants . UnevaluatedProperties , UnevaluatedProperties ) ;
607+ if ( UnevaluatedPropertiesSchema is not null )
608+ {
609+ writer . WriteOptionalObject (
610+ OpenApiConstants . UnevaluatedProperties ,
611+ UnevaluatedPropertiesSchema ,
612+ ( w , s ) => s . SerializeAsV31 ( w ) ) ;
613+ }
614+ else if ( ! UnevaluatedProperties )
615+ {
616+ writer . WriteProperty ( OpenApiConstants . UnevaluatedProperties , UnevaluatedProperties ) ;
617+ }
608618 }
609- // true is the default, no need to write it out
610619 writer . WriteOptionalCollection ( OpenApiConstants . Examples , Examples , ( nodeWriter , s ) => nodeWriter . WriteAny ( s ) ) ;
611620 writer . WriteOptionalMap ( OpenApiConstants . PatternProperties , PatternProperties , ( w , s ) => s . SerializeAsV31 ( w ) ) ;
612621 writer . WriteOptionalMap ( OpenApiConstants . DependentRequired , DependentRequired , ( w , s ) => w . WriteValue ( s ) ) ;
@@ -827,19 +836,24 @@ private void SerializeAsV2(
827836 // x-nullable extension
828837 SerializeNullable ( writer , OpenApiSpecVersion . OpenApi2_0 ) ;
829838
830- // Write UnevaluatedPropertiesSchema as extension if present
831- if ( UnevaluatedPropertiesSchema is not null )
839+ // Write UnevaluatedPropertiesSchema as extension if present.
840+ // Only emit when the type could include objects.
841+ // Skip when type is explicitly set to a non-object type (array, string, number, integer, boolean, null).
842+ if ( ! Type . HasValue || ( Type . Value & JsonSchemaType . Object ) != 0 )
832843 {
833- writer . WriteOptionalObject (
834- OpenApiConstants . UnevaluatedPropertiesExtension ,
835- UnevaluatedPropertiesSchema ,
836- ( w , s ) => s . SerializeAsV2 ( w ) ) ;
837- }
838- // Write boolean false as extension if explicitly set to false
839- else if ( ! UnevaluatedProperties )
840- {
841- writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
842- writer . WriteValue ( false ) ;
844+ if ( UnevaluatedPropertiesSchema is not null )
845+ {
846+ writer . WriteOptionalObject (
847+ OpenApiConstants . UnevaluatedPropertiesExtension ,
848+ UnevaluatedPropertiesSchema ,
849+ ( w , s ) => s . SerializeAsV2 ( w ) ) ;
850+ }
851+ // Write boolean false as extension if explicitly set to false
852+ else if ( ! UnevaluatedProperties )
853+ {
854+ writer . WritePropertyName ( OpenApiConstants . UnevaluatedPropertiesExtension ) ;
855+ writer . WriteValue ( false ) ;
856+ }
843857 }
844858
845859 // Write patternProperties as an extension
0 commit comments