【问题标题】:Symfony - Error deserializing json from objects with relationshipsSymfony - 从具有关系的对象反序列化 json 时出错
【发布时间】:2018-04-10 11:07:40
【问题描述】:

使用 SF 2.8 和序列化组件。

我有 2 个具有多对一关系的实体。

实体USUARIO

...
class Usuario implements UserInterface
{
...
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var string
 *
 * @ORM\Column(name="nombre", type="string", length=50)
 */
private $nombre;

/**
 * @var string
 *
 * @ORM\Column(name="apellidos", type="string", length=100)
 */
private $apellidos;

...getters and setters...

实体计划

...
class Plan
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="\UsuariosBundle\Entity\Usuario", cascade={"persist"})
 * @ORM\JoinColumn(name="usuario_id", referencedColumnName="id", onDelete="CASCADE")
 */
private $usuario;

/**
 * @var array
 *
 * @ORM\Column(name="json_dieta", type="json_array")
 */
private $jsonDieta;

...getters and setters...   

如您所见,属性 $usuario(实体计划)与 $id(实体 usuario)相连。

我的目的是在数据库的表计划的一个字段中保存一个json,以便在需要时恢复数据;为此,首先我必须序列化数据并将其保存到数据库(完成!)但是当我必须反序列化它们以恢复数据并将它们转换为对象时,我会收到此错误:

类型错误:传递给 ComponentesBundle\Entity\Receta::setUsuario() 的参数 1 必须是 UsuariosBundle\Entity\Usuario 的实例,给定数组,在 C:\xampp7\htdocs\Dietas\vendor\ 中调用symfony\serializer\Normalizer\GetSetMethodNormalizer.php 第 118 行

我的控制器

...
$em = $this->getDoctrine()->getManager();

    $plan =$em->getRepository('UsuariosBundle:Plan')->findOneByUsuario($user->getId());

    $serializer = new Serializer(
        array(new GetSetMethodNormalizer(), new ArrayDenormalizer()),
        array(new JsonEncoder())
        );
    $jsonDeserializado = $serializer->deserialize($plan->getJsonDieta(), 'ComponentesBundle\Entity\Receta[][][]', 'json');
    dump($jsonDeserializado);
...

知道如何解决这个问题吗?

【问题讨论】:

    标签: php symfony deserialization


    【解决方案1】:

    首先,您可以在此处查看如何看起来像正确的实体和一对多双向映射: Relationships in Doctrine 之后,您可以在实体内部使用序列化器注释策略,或者您可以为序列化器创建映射策略,哪些属性可以序列化,哪些不可以

    【讨论】:

    • 感谢您的回复;在这种情况下,我使用单向关系并且我已经检查过它,我认为它可以;如果我想避免序列化或反序列化冲突属性,使用组注释可能是一种解决方案,但我需要像整个对象一样转换完整的 json
    • 好吧,我明白了,但我会推荐你​​使用jmsyst.com/bundles/JMSSerializerBundle
    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多