From 6a2a132b864e862655a12c805aec6dde7324d2af Mon Sep 17 00:00:00 2001 From: Jannik Zschiesche Date: Tue, 12 Nov 2024 21:23:55 +0100 Subject: [PATCH 1/2] Allow normalizing empty `stdClass` --- CHANGELOG.md | 6 ++++ src/Normalizer/SimpleNormalizer.php | 7 +++++ tests/Normalizer/ObjectNormalizationTest.php | 29 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2bbd8d..4409a40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +1.3.2 +===== + +* (improvement) Allow normalizing empty `stdClass`. + + 1.3.1 ===== diff --git a/src/Normalizer/SimpleNormalizer.php b/src/Normalizer/SimpleNormalizer.php index e62c3ba..d8fd607 100644 --- a/src/Normalizer/SimpleNormalizer.php +++ b/src/Normalizer/SimpleNormalizer.php @@ -40,6 +40,13 @@ public function normalize (mixed $value, array $context = []) : mixed if (\is_object($value)) { + // Allow empty stdClass as a way to force a JSON {} instead of an + // array which would encode to [] + if ($value instanceof \stdClass && [] === get_object_vars($value)) + { + return $value; + } + try { $className = $value::class; diff --git a/tests/Normalizer/ObjectNormalizationTest.php b/tests/Normalizer/ObjectNormalizationTest.php index f15f87c..7ff20a3 100644 --- a/tests/Normalizer/ObjectNormalizationTest.php +++ b/tests/Normalizer/ObjectNormalizationTest.php @@ -43,6 +43,35 @@ public static function getNormalizedType () : string self::assertSame(["id" => 42], $normalizer->normalize($value)); } + /** + * + */ + public function testEmptyStdClass () : void + { + $normalizer = $this->createNormalizer(); + $object = new \stdClass(); + + self::assertSame( + $object, + $normalizer->normalize($object), + ); + } + + + /** + * + */ + public function testNonEmptyStdClassIsInvalid () : void + { + $normalizer = $this->createNormalizer(); + $object = new \stdClass(); + $object->prop = 5; + + $this->expectException(ObjectTypeNotSupportedException::class); + $this->expectExceptionMessage("Can't normalize type stdClass"); + $normalizer->normalize($object); + } + /** * */ From 473ce0ee4d6454f9e362c5723faa995b143c50be Mon Sep 17 00:00:00 2001 From: Jannik Zschiesche Date: Tue, 12 Nov 2024 21:24:52 +0100 Subject: [PATCH 2/2] Bump janus --- composer.json | 2 +- src/Normalizer/SimpleNormalizer.php | 4 ++-- tests/Normalizer/ObjectNormalizationTest.php | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 6c9c11e..db9537f 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "symfony/http-kernel": "^6.4 || ^7.0" }, "require-dev": { - "21torr/janus": "^1.3", + "21torr/janus": "^1.4", "bamarni/composer-bin-plugin": "^1.8", "doctrine/common": "^3.4", "roave/security-advisories": "dev-latest", diff --git a/src/Normalizer/SimpleNormalizer.php b/src/Normalizer/SimpleNormalizer.php index d8fd607..72dde2d 100644 --- a/src/Normalizer/SimpleNormalizer.php +++ b/src/Normalizer/SimpleNormalizer.php @@ -63,14 +63,14 @@ public function normalize (mixed $value, array $context = []) : mixed } catch (ServiceNotFoundException $exception) { - throw new ObjectTypeNotSupportedException(sprintf( + throw new ObjectTypeNotSupportedException(\sprintf( "Can't normalize type %s", get_debug_type($value), ), 0, $exception); } } - throw new UnsupportedTypeException(sprintf( + throw new UnsupportedTypeException(\sprintf( "Can't normalize type %s", get_debug_type($value), )); diff --git a/tests/Normalizer/ObjectNormalizationTest.php b/tests/Normalizer/ObjectNormalizationTest.php index 7ff20a3..c15e848 100644 --- a/tests/Normalizer/ObjectNormalizationTest.php +++ b/tests/Normalizer/ObjectNormalizationTest.php @@ -57,7 +57,6 @@ public function testEmptyStdClass () : void ); } - /** * */