2016-03-31 8 views
2

Ich möchte ein JSON zu einem Objekt deserialisieren, das eine Entitätsbeziehung hat.deserialize json zu Array von Entitäten

eingehenden JSON-Daten


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

Das Ergebnis json Deserialisierung wie diese

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

ist

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

Ich möchte ein Objekt deserialisieren wie diese

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

Ich verstehe, warum Deserialisierung Buch nicht deserialisieren kann. Mit JMSSerialzerBundle existiert die Annotation Typ, um diesen Fall aufzulösen.

Ist es möglich, dies mit der Symfony Serializer-Komponente zu tun, oder muss ich dafür den JMSSerializer verwenden?

Danke für Ihre Hilfe;)

Meine Objekte


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

Was vor allem wollen Sie tun? Senden Sie einige Daten an eine Rest-API? – Tobias

+0

Ich möchte nur erwähnen, es gibt eine Doktrin dbal Treiber für den Rest, so dass Sie sich nicht um fast alles kümmern müssen – Tobias

+0

@Tobias ich implementieren einen Web-Service "API wie", aber ich verwende keine Doktrin, um Daten zu persistieren. Ich möchte Daten zu einem Objekt (mit Entitätszuordnungen) mit Einschränkungsverletzungen deserialisieren. – guns17

Antwort

1

Guilhem richtig ist, ist die Standard Symfony ObjectNormalizer nicht in der Lage für jetzt Eigenschaften von nicht skalare Typen zu normalisieren.

jedoch diese Funktion in Symfony 3.1 wird hinzugefügt: https://github.com/symfony/symfony/pull/17660

In der Zwischenzeit können Sie kopieren/einfügen die ObjectNormalizer Version in der oben in Ihrem Projekt verknüpfen PR zur Verfügung gestellt.

Sie können auch einen Blick auf eine ähnliche Implementierung nehmen in API Platform:

1

Der symfony Serializer denormalize komplexen Eigenschaften nicht können.

Ich glaube, dass der einzige Weg, das zu tun ist Ihr Objekt Denormalisierung selbst verwalten:

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

    // ... 
} 

Sie können auch einen benutzerdefinierten normalizer erstellen, aber dies ist komplizierter (Sie können einen Blick auf this article nehmen die erklärt mehr oder weniger wie man das macht).

Ich hoffe, dies wird Ihnen helfen :-)

+0

Danke @Guilhem ich werde das versuchen – guns17