Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
687 views
in Technique[技术] by (71.8m points)

serialization - Symfony Serializer of DateTime Response String

When attempting to perform a doctrine query and serialze it to json (not using JSM, using the symfony serializer) I get the following in the json:

""due":{"timezone":{"name":"Europe/Berlin","transitions":[{"ts":-2147483648,"time":"1901-12-13T20:45:52+0000","offset":3208,"isdst":false,"abbr":"LMT"},{"ts":-2147483648,"time":"1901-12-13T20:45:52+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-1693706400,"time":"1916-04-30T22:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-1680483600,"time":"1916-09-30T23:00:00+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-1663455600,"time":"1917-04-16T01:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-1650150000,"time":"1917-09-17T01:00:00+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-1632006000,"time":"1918-04-15T01:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-1618700400,"time":"1918-09-16T01:00:00+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-938905200,"time":"1940-04-01T01:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-857257200,"time":"1942-11-02T01:00:00+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-844556400,"time":"1943-03-29T01:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-828226800,"time":"1943-10-04T01:00:00+0000","offset":3600,"isdst":false,"abbr":"CET"},{"ts":-812502000,"time":"1944-04-03T01:00:00+0000","offset":7200,"isdst":true,"abbr":"CEST"},{"ts":-796777200,"time":"1944-10-02T01:00:00+0000","offset":3600,"

When storing the due date, the timezone is saved and there is an additional timezone field stored. Is there a way to pull the date in a specific format or specify the timezone to use when retrieving?

 public function blahAction(Request $request)
{
    $currentUser = $this->getUser();
    $em = $this->getDoctrine()->getManager();
    $blahs = $em->getRepository('AppBundle:blah')->findAllByStatus($currentUser,'TODO');
    $encoders = array(new XmlEncoder(), new JsonEncoder());
    $normalizer = array(new ObjectNormalizer());
    $serializer = new Serializer($normalizer, $encoders);
    $response = new Response($serializer->serialize($blahs, 'json'));
    $response->headers->set('Content-Type', 'application/json');
    return $response;
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You have 2 ways to get RFC3339 Datetime format ...

Option 1:

Add DateTimeNormalizer as normalizer. An example is https://symfony.com/doc/current/components/serializer.html#recursive-denormalization-and-type-safety.

Change

$normalizer = array(new ObjectNormalizer());

by

$normalizer = array(new DateTimeNormalizer(), new ObjectNormalizer());

Option 2

More simple is using "serializer" container service ... your code will look like ...

public function blahAction(Request $request)
{
    $currentUser = $this->getUser();
    $em = $this->getDoctrine()->getManager();
    $blahs = $em->getRepository('AppBundle:blah')->findAllByStatus($currentUser,'TODO');
    $response = new Response($this->get('serializer')->serialize($blahs, 'json'));
    $response->headers->set('Content-Type', 'application/json');
    return $response;
}

.. or, if your prefer autowiring way (this code is unchecked)

public function blahAction(Request $request, SymfonyComponentSerializerSerializerInterface $serializer)
{
    $currentUser = $this->getUser();
    $em = $this->getDoctrine()->getManager();
    $blahs = $em->getRepository('AppBundle:blah')->findAllByStatus($currentUser,'TODO');
    $response = new Response($serializer->serialize($blahs, 'json'));
    $response->headers->set('Content-Type', 'application/json');
    return $response;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...