diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php index 6805a29935d9c..6253045f3e884 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php @@ -362,8 +362,8 @@ protected function instantiateObject(array &$data, string $class, array &$contex } $variadicParameters = []; - foreach ($data[$paramName] as $parameterData) { - $variadicParameters[] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format); + foreach ($data[$paramName] as $parameterKey => $parameterData) { + $variadicParameters[$parameterKey] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format); } $params = array_merge($params, $variadicParameters); diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php index 822b21dd5e411..33f44430591f8 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php @@ -201,6 +201,36 @@ public function testObjectWithVariadicConstructorTypedArguments(AbstractNormaliz } } + /** + * @dataProvider getNormalizer + */ + public function testVariadicSerializationWithPreservingKeys(AbstractNormalizer $normalizer) + { + $d1 = new Dummy(); + $d1->foo = 'Foo'; + $d1->bar = 'Bar'; + $d1->baz = 'Baz'; + $d1->qux = 'Quz'; + $d2 = new Dummy(); + $d2->foo = 'FOO'; + $d2->bar = 'BAR'; + $d2->baz = 'BAZ'; + $d2->qux = 'QUZ'; + $arr = ['d1' => $d1, 'd2' => $d2]; + $obj = new VariadicConstructorTypedArgsDummy(...$arr); + + $serializer = new Serializer([$normalizer], [new JsonEncoder()]); + $normalizer->setSerializer($serializer); + $this->assertEquals( + '{"foo":{"d1":{"foo":"Foo","bar":"Bar","baz":"Baz","qux":"Quz"},"d2":{"foo":"FOO","bar":"BAR","baz":"BAZ","qux":"QUZ"}}}', + $data = $serializer->serialize($obj, 'json') + ); + + $dummy = $normalizer->denormalize(json_decode($data, true), VariadicConstructorTypedArgsDummy::class); + $this->assertInstanceOf(VariadicConstructorTypedArgsDummy::class, $dummy); + $this->assertEquals($arr, $dummy->getFoo()); + } + public static function getNormalizer() { $extractor = new PhpDocExtractor();