在 Symfony 3.2 中将 json 反序列化为嵌入对象 - 给出了“Acme\StoreBundle\Document\Gps”类型的预期参数,“array”

M.Z*_*.Z. 2 serialization symfony

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;

}
...
Run Code Online (Sandbox Code Playgroud)

Acme\StoreBundle\Document\Gps

/**
 * @MongoDB\EmbeddedDocument
 */

class Gps
{

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

private $latitude;


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

}
...
Run Code Online (Sandbox Code Playgroud)

mongo json 文档

{
"hasemail": true,
"gps": {
    "latitude": 42.941579990394,
    "longitude": -85.244641161525
},
"email": [
    "sdfgsdfg@sfgsdfg.org",
    "sdfgsdfg@fgsdfg.com",
    "sdfgsdfg@sdfgsdfg.com"
]
}
Run Code Online (Sandbox Code Playgroud)

将 mongo 文档序列化为 json 工作完美。但是将 json 反序列化为文档会引发错误:“给出了类型为 'Acme\StoreBundle\Document\Gps'、'array' 的预期参数”

反序列化代码:

$post = $request->getContent();
$serializer = $this->get('serializer');
$person = $serializer->deserialize($post, Person::class, 'json');
Run Code Online (Sandbox Code Playgroud)

M.Z*_*.Z. 5

所以最后我使用了 ReflectionExtractor 并且它的工作很有魅力。不需要自定义非规范化器。

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());
Run Code Online (Sandbox Code Playgroud)