Symfony+;JMS序列化程序反序列化为现有对象

Symfony+;JMS序列化程序反序列化为现有对象,symfony,doctrine-orm,jmsserializerbundle,jms-serializer,Symfony,Doctrine Orm,Jmsserializerbundle,Jms Serializer,我一直在想,是否可以使用JMS序列化程序将JSON反序列化为现有对象 通常,这对于使用JSON格式的新数据更新现有对象非常有用。Symfony的标准反序列化程序似乎提供了这一点,但我似乎找不到任何关于JMS的东西。如果我想要serializedName注释选项,就必须使用JMS “解决方法”是反序列化,然后使用Doctrine的EntityManager进行合并,但这只能很好地工作,如果JSON不包含每个字段,您很难识别哪些字段会被更新。因此可以这样做,我还没有完全弄清楚如何进行合并,但我再次放

我一直在想,是否可以使用JMS序列化程序将JSON反序列化为现有对象

通常,这对于使用JSON格式的新数据更新现有对象非常有用。Symfony的标准反序列化程序似乎提供了这一点,但我似乎找不到任何关于JMS的东西。如果我想要serializedName注释选项,就必须使用JMS


“解决方法”是反序列化,然后使用Doctrine的EntityManager进行合并,但这只能很好地工作,如果JSON不包含每个字段,您很难识别哪些字段会被更新。

因此可以这样做,我还没有完全弄清楚如何进行合并,但我再次放弃了JMS,仅供参考,因为我想这比无缘无故地把问题提出来要好:


您可能还会在GitHub周围发现更多的挖掘工作。

我一直在努力寻找解决方案,但最终找到了它,现在我们开始:

  • 您的
    服务。yaml
  • 创建类
    App\Service\InitializedObjectConstructor.php

在哪里可以看到标准的Symfony反序列化程序提供了这些功能?JMS只是一个更为“完整”的序列化程序,具有强大的功能,但我怀疑它是否会缺少针对Symfony本机的功能。我知道发生这种情况的唯一时间是针对当前会话中的用户,但反序列化的数据用于从数据库中获取用户,因此使用的是条令,因此不会直接反序列化“到”一个对象,是的,似乎你可以用JMS做我想做的事情,当你构建它的时候,必须把一些东西放到上下文中,但是还没有完全解决它。
    jms_serializer.object_constructor:
        alias: jms_serializer.initialized_object_constructor

    jms_serializer.initialized_object_constructor:
        class: App\Service\InitializedObjectConstructor
        arguments: ["@jms_serializer.unserialize_object_constructor"]
<?php

declare(strict_types=1);

namespace App\Service;

use JMS\Serializer\Construction\ObjectConstructorInterface;
use JMS\Serializer\DeserializationContext;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Visitor\DeserializationVisitorInterface;

class InitializedObjectConstructor implements ObjectConstructorInterface
{
    private $fallbackConstructor;

    /**
     * @param ObjectConstructorInterface $fallbackConstructor Fallback object constructor
     */
    public function __construct(ObjectConstructorInterface $fallbackConstructor)
    {
        $this->fallbackConstructor = $fallbackConstructor;
    }

    /**
     * {@inheritdoc}
     */
    public function construct(
        DeserializationVisitorInterface $visitor,
        ClassMetadata $metadata,
        $data,
        array $type,
        DeserializationContext $context
    ): ?object {
        if ($context->hasAttribute('target') && 1 === $context->getDepth()) {
            return $context->getAttribute('target');
        }

        return $this->fallbackConstructor->construct($visitor, $metadata, $data, $type, $context);
    }
}

        $object = $this->entityManager->find('YourEntityName', $id);

        $context = new DeserializationContext();
        $context->setAttribute('target', $object);

        $data = $this->serializer->deserialize($request->getContent(), 'YourEntityClassName', 'json', $context);