diff --git a/src/Symfony/Component/Serializer/CHANGELOG.md b/src/Symfony/Component/Serializer/CHANGELOG.md index 23480900a9242..e3f66bd27e18a 100644 --- a/src/Symfony/Component/Serializer/CHANGELOG.md +++ b/src/Symfony/Component/Serializer/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add support of PHP backed enumerations + * Add support for preserving empty object in object property 5.3 --- diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index a7f6380d6ad9c..a7b9a519bb024 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -592,6 +592,10 @@ private function updateData(array $data, string $attribute, $attributeValue, str return $data; } + if ([] === $attributeValue && ($context[self::PRESERVE_EMPTY_OBJECTS] ?? $this->defaultContext[self::PRESERVE_EMPTY_OBJECTS] ?? false)) { + $attributeValue = new \ArrayObject(); + } + if ($this->nameConverter) { $attribute = $this->nameConverter->normalize($attribute, $class, $format, $context); } diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index 3a865dd76aa3b..e1b79fb3db601 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -535,7 +535,10 @@ public function testNormalizePreserveEmptyArrayObject() $object['foo'] = new \ArrayObject(); $object['bar'] = new \ArrayObject(['notempty']); $object['baz'] = new \ArrayObject(['nested' => new \ArrayObject()]); - $this->assertEquals('{"foo":{},"bar":["notempty"],"baz":{"nested":{}}}', $serializer->serialize($object, 'json', [AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true])); + $object['innerObject'] = new class() { + public $map = []; + }; + $this->assertEquals('{"foo":{},"bar":["notempty"],"baz":{"nested":{}},"innerObject":{"map":{}}}', $serializer->serialize($object, 'json', [AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true])); } public function testNormalizeScalar()