Browse Source

fixes JSON representation of empty objects (closes #43)

Johannes M. Schmitt 12 năm trước cách đây
mục cha
commit
66b26e97e9

+ 18 - 0
src/JMS/Serializer/JsonSerializationVisitor.php

@@ -18,6 +18,8 @@
 
 namespace JMS\Serializer;
 
+use JMS\Serializer\Metadata\ClassMetadata;
+
 class JsonSerializationVisitor extends GenericSerializationVisitor
 {
     private $options = 0;
@@ -49,4 +51,20 @@ class JsonSerializationVisitor extends GenericSerializationVisitor
 
         return $result;
     }
+
+    public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context)
+    {
+        $rs = parent::endVisitingObject($metadata, $data, $type, $context);
+
+        // Force JSON output to "{}" instead of "[]" if it contains either no properties or all properties are null.
+        if (empty($rs)) {
+            $rs = new \ArrayObject();
+
+            if (array() === $this->getRoot()) {
+                $this->setRoot($rs);
+            }
+        }
+
+        return $rs;
+    }
 }

+ 8 - 0
tests/JMS/Serializer/Tests/Serializer/JsonSerializationTest.php

@@ -164,6 +164,14 @@ class JsonSerializationTest extends BaseSerializationTest
         $this->assertInternalType($primitiveType, $result);
     }
 
+    /**
+     * @group empty-object
+     */
+    public function testSerializeEmptyObject()
+    {
+        $this->assertEquals('{}', $this->serialize(new Author(null)));
+    }
+
     protected function getFormat()
     {
         return 'json';

+ 1 - 1
tests/JMS/Serializer/Tests/SerializerBuilderTest.php

@@ -74,7 +74,7 @@ class SerializerBuilderTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($this->builder, $this->builder->configureHandlers(function(HandlerRegistry $registry) {
         }));
 
-        $this->assertEquals('[]', $this->builder->build()->serialize(new \DateTime('2020-04-16'), 'json'));
+        $this->assertEquals('{}', $this->builder->build()->serialize(new \DateTime('2020-04-16'), 'json'));
     }
 
     /**