【问题标题】:deserialize json to array of entities将 json 反序列化为实体数组
【发布时间】:2016-04-01 17:56:36
【问题描述】:

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

传入的 JSON 数据


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

这样的json反序列化结果

$object = $this->get('serializer')->deserialize($jsonData, 'Author', 'json');

 Author { #name: 'john' #books: array:1 [ 0 => array:1 [ "title" => "My life" ] ] }

我想反序列化成这样的对象

Author { #name: 'john' #books: array:1 [ Book { "title" => "My life" } ] }

我明白为什么反序列化无法反序列化 Book。使用 JMSSerialzerBundle,存在 Type 注释来解决这种情况。

是否可以使用 Symfony Serializer 组件来实现,或者我必须为此使用 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;
        }
    }

【问题讨论】:

  • 你特别想做什么?向 REST API 发送一些数据?
  • 只想提一下,有一个用于休息的原则 dbal 驱动程序,因此您几乎不需要关心任何事情
  • @Tobias 我实现了一个“类似 API”的 Web 服务,但我不使用原则来保存数据。我想将数据反序列化为违反约束的对象(具有实体关联)。

标签: symfony deserialization


【解决方案1】:

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

不过,这个功能正在 Symfony 3.1 中添加:https://github.com/symfony/symfony/pull/17660

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

您还可以查看API Platform 中提供的类似实现:

【讨论】:

    【解决方案2】:

    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);
            }
        }
    
        // ...
    }
    

    您也可以创建自定义规范器,但这更复杂(您可以查看this article,它或多或少地解释了如何做到这一点)。

    希望对你有帮助:-)

    【讨论】:

    • 谢谢@Guilhem 我会试试这个
    猜你喜欢
    • 2014-05-27
    • 2021-09-27
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多