Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

deserializing json to embedded object in Symfony 3.2 - Expected argument of type "Acme\StoreBundle\Document\Gps", "array" given

Acme\StoreBundle\Document\Person

/**
 * @MongoDB\Document
 */

class Person
{

/**
 * @MongoDB\bool
 */

private $hasemail;

/**
 * @MongoDB\EmbedOne(targetDocument="Gps")
 */

private $gps;

/**
 * @MongoDB\Field(name="email", type="collection")
 */

private $email;

}
...

Acme\StoreBundle\Document\Gps

/**
 * @MongoDB\EmbeddedDocument
 */

class Gps
{

/**
 * @MongoDB\Field(type="float")
 */

private $latitude;


/**
 * @MongoDB\Field(type="float")
 */
private $longitude;

}
...

mongo json document

{
"hasemail": true,
"gps": {
    "latitude": 42.941579990394,
    "longitude": -85.244641161525
},
"email": [
    "[email protected]",
    "[email protected]",
    "[email protected]"
]
}

serializing mongo document to json works perfect. but deserializing json to document throws an error: "Expected argument of type 'Acme\StoreBundle\Document\Gps', 'array' given"

deserialize code:

$post = $request->getContent();
$serializer = $this->get('serializer');
$person = $serializer->deserialize($post, Person::class, 'json');
like image 576
M.Z. Avatar asked Jan 23 '26 05:01

M.Z.


1 Answers

so finally I used ReflectionExtractor and it worked like charm. No custom denormalizers necessary.

http://symfony.com/doc/current/components/serializer.html#recursive-denormalization-and-type-safety

    $post = $request->getContent();

    $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); //

    $serializer = new Serializer(array($normalizer, new DateTimeNormalizer(\DateTime::ISO8601), new ObjectNormalizer()), [new JsonEncoder()]);


    $person = $serializer->deserialize($post, Person::class, 'json');

    $dm = $this->get('doctrine_mongodb')->getManager();
    $dm->persist($person);
    $dm->flush();

    return new Response('Created id ' . $person->getId());
like image 72
M.Z. Avatar answered Jan 25 '26 10:01

M.Z.