2016-03-31 13 views
2

エンティティリレーションを持つオブジェクトにJSONを逆シリアル化したいとします。jsonをエンティティの配列に逆シリアル化する

着信JSONデータ


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

この

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

ようなJSONの逆シリアル化の結果は、私はこの

ようなオブジェクトにデシリアライズしたい

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

あります210

デシリアライズでブックをデシリアライズできない理由を理解しています。 JMSSerialzerBundleでは、Typeアノテーションが存在し、このケースを解決します。

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; 
     } 
    } 

+0

?いくつかのデータを残りのAPIに送りますか? – Tobias

+0

あなたはほとんど何も気にする必要はありませんので、休憩のための教義のdbalドライバがあると言いたいだけです – Tobias

+0

@Tobias私はWebサービス "API like"を実装しますが、データを保持するためにdoctrineを使用しません。私は制約違反で(エンティティの関連付けを持つ)オブジェクトにデータを逆シリアル化したい。 – 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

関連する問題