Symfony 将json反序列化为实体数组

Symfony 将json反序列化为实体数组,symfony,deserialization,Symfony,Deserialization,我想将JSON反序列化为具有实体关系的对象 传入的JSON数据 { "name": "john", "books": [ { "title": "My life" } ] } json反序列化的结果如下 $object = $this->get('serializer')->deserialize($jsonData, 'Aut

我想将JSON反序列化为具有实体关系的对象

传入的JSON数据


    {
          "name": "john",
          "books": [
            {
              "title": "My life"
            }
          ]
    }

json反序列化的结果如下

$object = $this->get('serializer')->deserialize($jsonData, 'Author', 'json');
Author { #name: 'john' #books: array:1 [ Book { "title" => "My life" } ] }

我想反序列化到这样一个对象

$object = $this->get('serializer')->deserialize($jsonData, 'Author', 'json');
Author { #name: 'john' #books: array:1 [ Book { "title" => "My life" } ] }
我理解为什么反序列化不能反序列化这本书。对于JMSSerialzerBundle,存在类型注释来解决这种情况

是否可以使用Symfony序列化程序组件进行此操作,或者我必须使用JMSSerializer进行此操作

谢谢你的帮助;)

我的物品


class Author

    {
        private $name;

        private $books;

        /**
         * @return mixed
         */
        public function getName()
        {
            return $this->name;
        }

        /**
         * @param mixed $name
         */
        public function setName($name)
        {
            $this->name = $name;
        }

        /**
         * @return mixed
         */
        public function getBooks()
        {
            return $this->books;
        }

        /**
         * @param mixed $books
         */
        public function setBooks(array $books)
        {
            $this->books = $books;
        }
    }

    class Book
    {
        private $title;

        private $author;

        /**
         * @return mixed
         */
        public function getTitle()
        {
            return $this->title;
        }

        /**
         * @param mixed $title
         */
        public function setTitle($title)
        {
            $this->title = $title;
        }

        /**
         * @return mixed
         */
        public function getAuthor()
        {
            return $this->author;
        }

        /**
         * @param mixed $author
         */
        public function setAuthor(Author $author)
        {
            $this->author = $author;
        }
    }


symfony序列化程序无法反规范化复杂属性

我认为唯一的方法是自己管理对象的非规范化:

use Symfony\Component\Serializer\Normalizer\DenormalizableInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;

class Author implements DenormalizableInterface {
    public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) {
        if (isset($data['name'])) {
            $this->setName($data['name']);
        }
        if (isset($data['books']) && is_array($data['books'])) {
            $books = array();
            foreach ($data['books'] as $book) {
                $books[] = $denormalizer->denormalize($book, Book::class, $format, $context);
            }
            $this->setBooks($books);
        }
    }

    // ...
}
您还可以创建一个自定义规范化器,但这更复杂(您可以看看这多少解释了如何做到这一点)


我希望这将帮助您:-)

Guillem是对的,默认的Symfony
ObjectNormalizer
目前无法规范化非标量类型的属性

但是,Symfony 3.1中添加了此功能:

同时,您可以在项目中复制/粘贴上面链接的PR中提供的
ObjectNormalizer
版本

您还可以查看以下类似的实现:


您特别想做什么?向rest API发送一些数据?只想提一下rest有一个原则dbal驱动程序,所以您几乎不需要关心它anything@Tobias我实现了一个“类似API”的web服务,但我不使用条令来持久化数据。我想将数据反序列化到具有约束冲突的对象(具有实体关联)。谢谢@Guilhem,我将尝试此操作