2016-12-20 2 views
1

в контроллере Symfony У меня есть следующие функции:Symfony3 десериализации JSON не работает, как ожидалось

/** 
* 
* @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()); 
} 

Я пытаюсь сделать POST с помощью завиток с

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

Payload выглядит следующим образом: { "имя": "Джон Доу", "ИГД": "2016-12-20T09: 01: 41 + 0100"}

класс, к которому должен JSON сериализации, как это:

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

My JSON получить десериализованный, что хорошо. Однако результатом являются две строки в Test.name и Test.datum. Я действительно хочу иметь строку в Test.name и объект DateTime в Test.datum.

По этой причине я ввел обратный вызов в функции выше. Однако обратный вызов никогда не вызывается.

Что я делаю неправильно?

С уважением

Оливер

+0

Я предполагаю, что тело обратного вызова может быть неправильным. Но я заметил, что обратный вызов вообще не называется. –

ответ

1

К сожалению, обратные вызовы вызываются только на процесс сериализации, а не на десериализации. См. source code: callbacks, используемый только в методе normalize(). Итак, вы можете:

  • a) Создайте объект DateTime вручную, например, в сеттере.
  • b) Сделайте свою собственную реализацию нормализатора (например, расширяет GetSetMethodNormalizer).
  • c) Используйте альтернативные сторонние решения, такие как JMS Serializer, это позволяет объявлять атрибут type для десериализации.
Смежные вопросы