diff --git a/src/Model/Schema/ObjectSchema.php b/src/Model/Schema/ObjectSchema.php index 7f50e14..e323b0e 100644 --- a/src/Model/Schema/ObjectSchema.php +++ b/src/Model/Schema/ObjectSchema.php @@ -13,7 +13,7 @@ public function __construct( public array $properties = [], public array $required = [], - public bool|Schema $additionalProperties = true, + public bool|Schema|null $additionalProperties = null, public ?int $minProperties = null, public ?int $maxProperties = null, ?string $title = null, diff --git a/src/Parser/Schema/Reader.php b/src/Parser/Schema/Reader.php index a3b34c2..c10014f 100644 --- a/src/Parser/Schema/Reader.php +++ b/src/Parser/Schema/Reader.php @@ -230,8 +230,8 @@ private function object(array $data, string $location, array $common): ObjectSch $required = isset($data['required']) ? array_map(strval(...), Value::list($data['required'], "{$location}/required")) : []; - $additional = $data['additionalProperties'] ?? true; - if (! is_bool($additional)) { + $additional = $data['additionalProperties'] ?? null; + if ($additional !== null && ! is_bool($additional)) { $additional = $this->read($additional, "{$location}/additionalProperties"); } diff --git a/tests/Schema/ReaderTest.php b/tests/Schema/ReaderTest.php index 66580dc..5d206ef 100644 --- a/tests/Schema/ReaderTest.php +++ b/tests/Schema/ReaderTest.php @@ -137,6 +137,14 @@ public function test_additional_properties_reads_as_boolean_or_schema(): void { $reader = $this->reader(Version::V3_0); + $unspecified = $reader->read(['type' => 'object'], '#/x'); + self::assertInstanceOf(ObjectSchema::class, $unspecified); + self::assertNull($unspecified->additionalProperties); + + $open = $reader->read(['type' => 'object', 'additionalProperties' => true], '#/x'); + self::assertInstanceOf(ObjectSchema::class, $open); + self::assertTrue($open->additionalProperties); + $closed = $reader->read(['type' => 'object', 'additionalProperties' => false], '#/x'); self::assertInstanceOf(ObjectSchema::class, $closed); self::assertFalse($closed->additionalProperties);