Return a JSON array from a Controller in Symfony

45,687

Solution 1

You need to do this (based on previous answer):

public function getAllCategoryAction() {
    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
        'SELECT c
        FROM AppBundle:Categoria c'
    );
    $categorias = $query->getArrayResult();

    $response = new Response(json_encode($categorias));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

It works perfect with any Query that Doctrine returns as array.

Solution 2

I think the @darkangelo answer need explainations.

The findAll() method return a collection of objects.

$categorias = $this->getDoctrine()
                   ->getRepository('AppBundle:Categoria')
                   ->findAll();

To build your response, you have to add all getters of your entities to your response like :

$arrayCollection = array();

foreach($categorias as $item) {
     $arrayCollection[] = array(
         'id' => $item->getId(),
         // ... Same for each property you want
     );
}

return new JsonResponse($arrayCollection);

Use QueryBuilder allows you to return results as arrays containing all properties :

$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
    'SELECT c
    FROM AppBundle:Categoria c'
);
$categorias = $query->getArrayResult();

return new JsonResponse($categorias);

The getArrayResult() avoids need of getters.

Solution 3

/**
 * @Route("/api/list", name="list")
 */
public function getList(SerializerInterface $serializer, SomeRepository $repo): JsonResponse
{
    $models = $repo->findAll();
    $data = $serializer->serialize($models, JsonEncoder::FORMAT);
    return new JsonResponse($data, Response::HTTP_OK, [], true);
}

Solution 4

Looks like you are trying to put into response a collection. For that you need to setup serializer (or retrieve data as an array).

Look at this doc pages: http://symfony.com/doc/current/components/http_foundation/introduction.html#creating-a-json-response

and

http://symfony.com/doc/current/cookbook/serializer.html.

Solution 5

You need to change your code this way:

/**
 * @Route(
 *      "/drop/getCategory/",
 *      name="getCategory"
 * )
 * @Method("GET")
 */
public function getAllCategoryAction() {
    $categorias = $this->getDoctrine()
                       ->getRepository('AppBundle:Categoria')
                       ->findAll();

    $categorias = $this->get('serializer')->serialize($categorias, 'json');

    $response = new Response($categorias);

    $response->headers->set('Content-Type', 'application/json');
    return $response;
}

If the serializer service is not enabled, you have to enable it in app/config/config.yml:

    framework:
        # ...
        serializer:
            enabled: true

For more advanced options for serialization, you can install JMSSerializerBundle

Share:
45,687

Related videos on Youtube

Giancarlo Ventura Granados
Author by

Giancarlo Ventura Granados

Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday Some lines here, but I dont know... Maybe someday

Updated on July 09, 2022

Comments

  • Giancarlo Ventura Granados
    Giancarlo Ventura Granados almost 2 years

    I am trying return a JSON response from a controller in Symfony 2. Form example, in Spring MVC I can get a JSON response with @ResponseBody annotattion. I want get a JSON response, no mtter if it is a JSON Array or a Json Object, then, manipulate it with javascript in the view.

    I try the next code:

    /**
         * @Route(
         *      "/drop/getCategory/",
         *      name="getCategory"
         * )
         * @Method("GET")
         */
        public function getAllCategoryAction() {
            $categorias = $this->getDoctrine()
                               ->getRepository('AppBundle:Categoria')
                               ->findAll();
    
            $response = new JsonResponse();
            $response->setData($categorias);
    
            $response->headers->set('Content-Type', 'application/json');
            return $response;
        }
    

    But I get [{},{}] as Response in the browser. I try with $response = new Response(json_encode($categorias)); too, but I get the same result.

  • Giancarlo Ventura Granados
    Giancarlo Ventura Granados over 9 years
    I get a 500 error: You have requested a non-existent service "serializer".
  • Alexandru Furculita
    Alexandru Furculita over 9 years
    You have to enable first the serializer service. In app/config/config.yml add this: framework: # ... serializer: enabled: true
  • Giancarlo Ventura Granados
    Giancarlo Ventura Granados over 9 years
    I get the solution: $categorias = $query->getArrayResult(); //$response->headers->set('Content-Type', 'application/json'); //return $response; //return $this->render('AppBundle:Front:test.html.twig', array('otra' => $otra)); return new Response(json_encode($categorias), 200);
  • Cerad
    Cerad over 9 years
    You should probably use newJsonResponse like you did in your question.
  • Artur O
    Artur O almost 4 years
    I get very ugly object "{\u0022id\u0022:105,\u0022name\u0022:\u00223..." how to fix it ?
  • Jan Bodnar
    Jan Bodnar almost 4 years
    @ArturO The serializer in this example returns a JSON string; check that the JsonResponse has the last parameter set to true.
  • bcag2
    bcag2 about 2 years
    as explain at symfony.com/doc/current/serializer.html add use Symfony\Component\Serializer\SerializerInterface;, I should add also use Symfony\Component\HttpFoundation\JsonResponse;