From d3c5055f7b9fa7bdf48bbe0cb6cb01daf7b32680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Mon, 1 Oct 2018 12:54:45 +0200 Subject: [PATCH] [Serializer] Add an option to skip null values --- src/Symfony/Component/Serializer/CHANGELOG.md | 1 + .../Serializer/Normalizer/AbstractObjectNormalizer.php | 5 +++++ .../Tests/Normalizer/AbstractObjectNormalizerTest.php | 10 ++++++++++ 3 files changed, 16 insertions(+) diff --git a/src/Symfony/Component/Serializer/CHANGELOG.md b/src/Symfony/Component/Serializer/CHANGELOG.md index 65f413625e62f..a14e8524ee33a 100644 --- a/src/Symfony/Component/Serializer/CHANGELOG.md +++ b/src/Symfony/Component/Serializer/CHANGELOG.md @@ -4,6 +4,7 @@ CHANGELOG 4.2.0 ----- + * added a `skip_null_values` context option to not serialize properties with a `null` values * `AbstractNormalizer::handleCircularReference` is now final and receives two optional extra arguments: the format and the context * added support for XML comment encoding (encoding `['#comment' => ' foo ']` results ``) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index aaf047a32398a..8573dca8f5e86 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -35,6 +35,7 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer const ENABLE_MAX_DEPTH = 'enable_max_depth'; const DEPTH_KEY_PATTERN = 'depth_%s::%s'; const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement'; + const SKIP_NULL_VALUES = 'skip_null_values'; private $propertyTypeExtractor; private $typesCache = array(); @@ -402,6 +403,10 @@ private function getTypes(string $currentClass, string $attribute) */ private function updateData(array $data, string $attribute, $attributeValue, string $class, ?string $format, array $context): array { + if (null === $attributeValue && ($context[self::SKIP_NULL_VALUES] ?? false)) { + return $data; + } + if ($this->nameConverter) { $attribute = $this->nameConverter->normalize($attribute, $class, $format, $context); } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php index 851ed7f9bbb86..91c69682957ca 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php @@ -161,6 +161,16 @@ public function testExtraAttributesException() 'allow_extra_attributes' => false, )); } + + public function testSkipNullValues() + { + $dummy = new Dummy(); + $dummy->bar = 'present'; + + $normalizer = new ObjectNormalizer(); + $result = $normalizer->normalize($dummy, null, array(AbstractObjectNormalizer::SKIP_NULL_VALUES => true)); + $this->assertSame(array('bar' => 'present'), $result); + } } class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer