2016-03-31 14 views
2

我想將JSON反序列化爲具有實體關係的對象。將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; 
     } 
    } 

+0

尤其是你想做些什麼?將一些數據發送到其他API? – Tobias

+0

只是想提到有一個休息的doctrine dbal驅動程序,所以你不需要關心幾乎任何東西 – Tobias

+0

@Tobias我實現了一個Web服務「API喜歡」,但我不使用教義來堅持數據。我想要將數據反序列化到一個對象(帶有實體關聯)並且違反約束條件。 – guns17

回答

1

吉揚是正確的,默認的Symfony ObjectNormalizer不能正常化非標量類型的屬性了。

然而,此功能正在Symfony的3.1增加:https://github.com/symfony/symfony/pull/17660

在此期間,您可以複製/粘貼在上面的項目中的鏈接的PR提供的ObjectNormalizer版本。

您還可以看看類似的執行提供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