Ver código fonte

Merge pull request #15 from baldurrensch/type_fix

Typecast when serializing primitive types
Johannes 12 anos atrás
pai
commit
b8f87c9715

+ 4 - 4
src/JMS/Serializer/GenericSerializationVisitor.php

@@ -51,7 +51,7 @@ abstract class GenericSerializationVisitor extends AbstractVisitor
             $this->root = $data;
         }
 
-        return $data;
+        return (string) $data;
     }
 
     public function visitBoolean($data, array $type)
@@ -60,7 +60,7 @@ abstract class GenericSerializationVisitor extends AbstractVisitor
             $this->root = $data;
         }
 
-        return $data;
+        return (boolean) $data;
     }
 
     public function visitInteger($data, array $type)
@@ -69,7 +69,7 @@ abstract class GenericSerializationVisitor extends AbstractVisitor
             $this->root = $data;
         }
 
-        return $data;
+        return (int) $data;
     }
 
     public function visitDouble($data, array $type)
@@ -78,7 +78,7 @@ abstract class GenericSerializationVisitor extends AbstractVisitor
             $this->root = $data;
         }
 
-        return $data;
+        return (float) $data;
     }
 
     /**

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

@@ -111,6 +111,58 @@ class JsonSerializationTest extends BaseSerializationTest
         $this->assertEquals('[{"full_name":"foo","_links":{"details":"http:\/\/foo.bar\/details\/foo","comments":"http:\/\/foo.bar\/details\/foo\/comments"}},{"full_name":"bar","_links":{"details":"http:\/\/foo.bar\/details\/bar","comments":"http:\/\/foo.bar\/details\/bar\/comments"}}]', $this->serialize($list));
     }
 
+    public function getPrimitiveTypes()
+    {
+        return array(
+            array(
+                'type' => 'boolean',
+                'data' => true,
+            ),
+            array(
+                'type' => 'boolean',
+                'data' => 1,
+            ),
+            array(
+                'type' => 'integer',
+                'data' => 123,
+            ),
+            array(
+                'type' => 'integer',
+                'data' => "123",
+            ),
+            array(
+                'type' => 'string',
+                'data' => "hello",
+            ),
+            array(
+                'type' => 'string',
+                'data' => 123,
+            ),
+            array(
+                'type' => 'double',
+                'data' => 0.1234,
+            ),
+            array(
+                'type' => 'double',
+                'data' => "0.1234",
+            ),
+        );
+    }
+
+    /**
+     * @dataProvider getPrimitiveTypes
+     */
+    public function testPrimitiveTypes($primitiveType, $data)
+    {
+        $visitor = $this->serializationVisitors->get('json')->get();
+        $functionToCall = 'visit' . ucfirst($primitiveType);
+        $result = $visitor->$functionToCall($data, array());
+        if ($primitiveType == 'double') {
+            $primitiveType = 'float';
+        }
+        $this->assertInternalType($primitiveType, $result);
+    }
+
     protected function getFormat()
     {
         return 'json';