From 6db2a00d660bdd097cee2febb546e71a44e4d5f6 Mon Sep 17 00:00:00 2001 From: Pavel Batanov Date: Thu, 8 Sep 2016 21:12:16 +0300 Subject: [PATCH] Traverse non-type-configured arrays * Fix #641 --- src/JMS/Serializer/GenericSerializationVisitor.php | 5 +++-- tests/JMS/Serializer/Tests/Serializer/ArrayTest.php | 11 ++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/JMS/Serializer/GenericSerializationVisitor.php b/src/JMS/Serializer/GenericSerializationVisitor.php index 6493ba4d0..c6dd9a480 100644 --- a/src/JMS/Serializer/GenericSerializationVisitor.php +++ b/src/JMS/Serializer/GenericSerializationVisitor.php @@ -98,12 +98,13 @@ public function visitArray($data, array $type, Context $context) $rs = array(); } - $isList = isset($type['params'][0]) && ! isset($type['params'][1]); + $isList = (isset($type['params'][0]) && ! isset($type['params'][1])) + || array_keys($data) === range(0, count($data) - 1); foreach ($data as $k => $v) { $v = $this->navigator->accept($v, $this->getElementType($type), $context); - if (null === $v && ( ! is_string($k) || $context->shouldSerializeNull() !== true)) { + if (null === $v && !$context->shouldSerializeNull()) { continue; } diff --git a/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php b/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php index edafee45e..d40b92d38 100644 --- a/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php +++ b/tests/JMS/Serializer/Tests/Serializer/ArrayTest.php @@ -19,6 +19,7 @@ namespace JMS\Serializer\Tests\Serializer; use JMS\Serializer\Handler\HandlerRegistry; +use JMS\Serializer\SerializationContext; use JMS\Serializer\Tests\Fixtures\Author; use JMS\Serializer\Tests\Fixtures\AuthorList; use JMS\Serializer\Tests\Fixtures\Order; @@ -120,4 +121,12 @@ public function testToArrayConversNestedArrayObjects() $result = $this->serializer->toArray($list); $this->assertSame(array('authors' => array(array())), $result); } -} \ No newline at end of file + + public function testNullArraySerialization() + { + $context = SerializationContext::create(); + $context->setSerializeNull(true); + $array = [0, null, 'a']; + $this->assertSame($array, $this->serializer->toArray($array, $context)); + } +}