2016-12-20 1 views
1

in einem Symfony-Controller erwartete ich die folgende Funktion haben:Symfony3 Deserialisierung von JSON nicht wie

/** 
* 
* @Route("/test", name="post_test") 
* @Method("POST") 
*/ 
public function postTest(Request $request){ 
    $normalizer = new GetSetMethodNormalizer(); 

    $callback = function ($dateTime) { 
     return $dateTime instanceof DateTime ? $dateTime->format(DateTime::ISO8601) : ''; 
    }; 

    $normalizer->setCallbacks(array('datum' => $callback)); 
    $encoder = new JsonEncoder(); 
    $serializer = new Serializer(array($normalizer), array($encoder)); 

    $test = $serializer->deserialize($request->getContent(),Test::class, 'json'); 
    return new Response($test->getName().":".$test->getDatum()); 
} 

Ich versuche, die POST über curl mit

curl -i -X POST http://127.0.0.1:8000/test -d '{"datum": "2016-12-20T09:01:41+0100", "name": "Alfons"}' 

Payload sieht aus wie zu tun: { "name": "John Doe", "Datum": "2016-12-20T09: 01: 41 + 0100"}

die Klasse, zu der die JSON serialisiert werden soll wie folgt lautet:

class Test { 
    private $name; 
    private $datum; 

    public function getName(){ 
     return $this->name; 
    } 

    public function setName($name){ 
     $this->name = $name; 
    } 

    public function getDatum(){ 
     return $this->datum; 
    } 

    public function setDatum($datum){ 
     $this->datum = $datum; 
    } 
} 

Meine JSON werden deserialisiert, was in Ordnung ist. Das Ergebnis sind jedoch zwei Zeichenfolgen in Test.name und Test.datum. Was ich eigentlich will, ist eine Zeichenfolge in Test.name und ein DateTime-Objekt in Test.datum.

Aus diesem Grund habe ich den Callback in der obigen Funktion eingetragen. Der Rückruf wird jedoch nie aufgerufen.

Was mache ich falsch?

Grüße

Oliver

+0

Ich nehme an, dass der Körper des Rückrufs falsch sein könnte. Aber ich habe bemerkt, dass der Rückruf überhaupt nicht aufgerufen wird. –

Antwort

1

Leider dass Rückrufe nur auf Serialisierungsprozeß aufgerufen, nicht auf der Deserialisierung. Siehe source code: callbacks, das nur in der normalize()-Methode verwendet wird. So können Sie:

  • a) Erstellen Sie ein DateTime Objekt manuell, zum Beispiel im Setter.
  • b) Machen Sie Ihre eigene Normalizer-Implementierung (z. B. erweitert die GetSetMethodNormalizer).
  • c) Verwenden Sie alternative Lösungen von Drittanbietern wie JMS Serializer, ermöglicht es, ein Attribut type für Deserialisierung zu deklarieren.