2016-03-31 4 views
2

Я хотел бы десериализовать JSON для объекта, имеющего отношение сущности.deserialize 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" } ] } 

Я понимаю, почему десериализация не позволяет десериализовать Книгу. С JMSSerialzerBundle существует аннотация типа, чтобы разрешить этот случай.

Возможно ли это сделать с помощью компонента 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; 
     } 
    } 

+0

Что особенно вы хотите сделать? Отправить некоторые данные в API для отдыха? – Tobias

+0

Просто хочу упомянуть, что есть доктрина dbal driver для отдыха, поэтому вам не нужно заботиться почти ни о чем. – Tobias

+0

@Tobias я реализую веб-сервис «API like», но я не использую доктрину для сохранения данных. Я хочу десериализовать данные для объекта (с ассоциациями сущностей) с нарушениями ограничений. – guns17

ответ

1

Guilhem прав, по умолчанию Symfony ObjectNormalizer не в состоянии нормализовать свойства, не являющиеся скалярных типов сейчас.

Однако, эта функция добавляется в Symfony 3.1: https://github.com/symfony/symfony/pull/17660

В то же время, вы можете копировать/вставить версию ObjectNormalizer, представленную в PR связаны выше в вашем проекте.

Вы также можете взглянуть на подобной реализации имеющейся в API Platform:

1

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 можете который объясняет более или менее, как это сделать).

Я надеюсь, что это поможет :-)

+0

Спасибо @Guilhem я попробую это – guns17

Смежные вопросы