2014-04-14 7 views
7

Ich habe ein JSON-Objekt, das ich erhielt, indem Sie eine Get API-Aufruf. Ich mache diesen Aufruf, um eine Liste von Objekten zu erhalten. Es ist eine Liste von Post ... Also ich habe eine Reihe von Post-Objekten.Symfony - Deserialize JSON zu einem Array von Entitäten

Hier die Ausgabe:

{ 
    "total":2, 
    "data":[ 
     { 
     "id":2, 
     "user":{ 
      "id":1, 
      "username":"sandro.tchikovani"    
     }, 
     "description":"cool", 
     "nb_comments":0, 
     "nb_likes":0, 
     "date_creation":"2014-04-13T20:07:34-0700" 
     }, 
     { 
     "id":1, 
     "user":{ 
      "id":1, 
      "username":"sandro.tchikovani", 
     }, 
     "description":"Premier pooooste #lol", 
     "nb_comments":0, 
     "nb_likes":0, 
     "date_creation":"2014-04-13T15:15:35-0700" 
     } 
    ] 
} 

Ich mag würde den Datenteil deserialisieren ... Das Problem ist, dass der Serializer in Symfony ist mir ein Fehler ...

Der Fehler, dass ich haben:

Class array<Moodress\Bundle\PosteBundle\Entity\Poste> does not exist 

Wie ich deserialisieren tun:

$lastPosts = $serializer->deserialize($data['data'], 'array<Moodress\Bundle\PosteBundle\Entity\Poste>', 'json'); 

Wie kann ich das Datenfeld deserialze ... Um ein Array von Posts zu haben. Ich möchte meiner Ansicht .twig ein Array geben Poste ... ich habe den Typ präzisiert wenn ich Deserialize ... Also ich kann nicht finden was das Problem ist ...

Danke.

+0

Sie weiter mit Ihrer Lösung gekommen? Ich frage mich, wie man JMS dazu bringen kann, ein solches 'data' Objekt innerhalb des json zu finden. – Malachi

+0

Ich hatte keine Wahl ... Ich habe nur eine für jeden auf dem Array, und deserialize die Daten für jeden Wert ... Ich hätte es auf eine andere Weise bevorzugt, aber ich konnte keine andere Lösung finden. – manonthemoon

Antwort

4

Der Fehler ist ziemlich klar. Ihre Zeichenfolge stimmt mit keiner vorhandenen Klasse überein.

$person = $serializer->deserialize($data['data'],'Moodress\Bundle\PosteBundle\Entity\Poste','json'); 

Update::

Ok dann

The example in official documentation says:

$person = $serializer->deserialize($data,'Acme\Person','xml'); 

In Ihrem Fall sollte es eher wie sein.

Zunächst scheint Ihre JSON-Datei nicht gültig zu sein (verwenden Sie http://jsonlint.com/, um es zu testen). Sei vorsichtig damit.

Zweitens werden Sie Ihre json als ein Array mit

$data = json_decode($yourJsonFile, true); 

holen müssen und dann können Sie zu jedem Array ‚data‘ Zugriff mit

foreach($data['data'] as $result) 
{ 
    /* Here you can hydrate your object manually like: 
    $person = new Person(); 
    $person->setId($user['id']); 
    $person->setDescription($user['description']); 

    Or you can use a denormalizer. */ 
} 
+0

Das Problem ist, dass $ Daten ['Daten'] ist ein Array von Postes ... Nicht nur eine ... Also muss ich Serialisierung verstehen, dass ich ein Array meines Entity-Typs deserialisieren möchte. Weißt du was ich meine? – manonthemoon

+0

Ich habe meine Antwort aktualisiert. Sollte den Trick machen. – Einenlum

+1

Ja, ich dachte darüber nach ... Wie du schon sagtest, es macht den Trick, aber in der Dokumentation heißt es, dass es möglich ist, das Array direkt zu serialisieren ... Wenn ich keine andere Lösung finde, werde ich es tun Schritt für Schritt, wie Sie es demonstriert haben. Ich denke nur, es wäre besser, den Array-Typ zu verwenden ... Aber ich weiß nicht warum, JMSSerialize mag meinen Code nicht. – manonthemoon

12

A weniger als ideale Lösung, die ich gefunden wurde, zuerst die JSON-Daten an dem Knoten, der das Datenfeld darstellt, zuerst zu decodieren und dann zu codieren. Zum Beispiel in Ihrem Fall:

$json = json_decode($json); 
$json = json_encode($json->data); 
$serializer->deserialize($json, 'array<Moodress\Bundle\PosteBundle\Entity\Poste>', 'json'); 

Es muss eine bessere Lösung als diese sein, aber dies scheint eleganter als die obige Lösung von de-Serialisierung json.

+0

Genau das, was ich brauchte. Dies sollte die akzeptierte Antwort sein. –

15

Ich denke, die beste Lösung ist hier neue PosteResponse Klasse zu erstellen, wie diese:

namespace Moodress\Bundle\PosteBundle\Response; 

use JMS\Serializer\Annotation\Type; 

class PosteResponse 
{ 
    /** 
    * @Type("integer") 
    */ 
    private $total; 

    /** 
    * @Type("array<Moodress\Bundle\PosteBundle\Entity\Poste>") 
    */ 
    private $data; 

    // Getters and setters here... 
} 

und Ihre Antwort auf diese Klasse deserialisiert:

$response = $serializer->deserialize(
    $json, 
    'Moodress\Bundle\PosteBundle\Response\PosteResponse', 
    'json' 
); 
$posts = $response->getData(); 

, die den Trick tun wird, und es erfordert nicht, dass Sie Ihre json manuell dekodieren und kodieren, die meiner Meinung nach riddiculous ist.