From b2b0d81f6a41e51fa5ec95d9f4b22a5d53e59569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nil=20Portugu=C3=A9s=20Calder=C3=B3?= Date: Fri, 10 Feb 2017 19:54:16 +0100 Subject: [PATCH] Do not collapse one-level objects if keys are different --- src/Transformer/AbstractTransformer.php | 19 ++++++++--- tests/Transformer/JsonTransformerTest.php | 40 +++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Transformer/AbstractTransformer.php b/src/Transformer/AbstractTransformer.php index e4f847f..7348df7 100644 --- a/src/Transformer/AbstractTransformer.php +++ b/src/Transformer/AbstractTransformer.php @@ -56,17 +56,28 @@ protected function recursiveSetValues(array &$array) /** * @param array $array + * @param null $parentKey + * @param null $currentKey */ - protected function recursiveFlattenOneElementObjectsToScalarType(array &$array) + protected function recursiveFlattenOneElementObjectsToScalarType(array &$array, $parentKey = null, $currentKey = null) { if (1 === \count($array) && \is_scalar(\end($array))) { - $array = \array_pop($array); + if ($parentKey == $currentKey) { + $array = \array_pop($array); + } } if (\is_array($array)) { - foreach ($array as &$value) { + foreach ($array as $parentKey => &$value) { + if (\is_array($value)) { - $this->recursiveFlattenOneElementObjectsToScalarType($value); + $key = null; + foreach($value as $key => $v) { + if (is_array($v)) { + $this->recursiveFlattenOneElementObjectsToScalarType($v, $parentKey, $key); + } + } + $this->recursiveFlattenOneElementObjectsToScalarType($value, $parentKey, $key); } } } diff --git a/tests/Transformer/JsonTransformerTest.php b/tests/Transformer/JsonTransformerTest.php index ae4a97a..d6b41e5 100644 --- a/tests/Transformer/JsonTransformerTest.php +++ b/tests/Transformer/JsonTransformerTest.php @@ -23,6 +23,46 @@ class JsonTransformerTest extends \PHPUnit_Framework_TestCase { + + public function testSerializationObjectWithArrayOfOneAttribute() + { + $object = new \stdClass(); + $object->payload = ['userId' => 1]; + + $serializer = new DeepCopySerializer(new JsonTransformer()); + + $expected = <<assertEquals($expected, $serializer->serialize($object)); + } + + public function testSerializationObjectWithObjectOfOneAttribute() + { + $internal = new \stdClass(); + $internal->userId = 1; + + $object = new \stdClass(); + $object->payload = $internal; + + $serializer = new DeepCopySerializer(new JsonTransformer()); + + $expected = <<assertEquals($expected, $serializer->serialize($object)); + } + public function testSerialization() { $object = $this->getObject();