无法在 symfony 2 中返回 json

问题描述 投票:0回答:4

这是我的控制器

public function index2Action($name)
    {   
  $em = $this->getDoctrine()->getEntityManager();
  $test = $em->getRepository('RestWebServiceBundle:Test')->findall();
  return new Response(json_encode(array('locations' => $test)));

    }

当我访问 URL 时,我得到:

{"locations":[{}]}

但是当我使用时:

public function index2Action($name)
    {   
$name ="Adam";
  return new Response(json_encode(array('locations' => $name)));

    }

我得到了 JSON。

我做错了什么?我正在尝试在第一个场景中获取 JSON。

更新:我已经验证 $test 变量确实不为空,当我对其执行 print_r 时,它会显示以下内容:

Array
(
    [0] => Rest\WebServiceBundle\Entity\Test Object
        (
            [id:protected] => 1
            [title:protected] => test title
            [author:protected] => test author
            [blog:protected] => this is the blog
            [tags:protected] => 
            [comments:protected] => 
            [created:protected] => DateTime Object
                (
                    [date] => 2012-05-13 00:00:00
                    [timezone_type] => 3
                    [timezone] => America/Chicago
                )

            [updated:protected] => DateTime Object
                (
                    [date] => 2012-05-13 00:00:00
                    [timezone_type] => 3
                    [timezone] => America/Chicago
                )

        )

)
null
php json rest symfony
4个回答
2
投票

我强烈建议您使用序列化器来返回实体。查看序列化器组件或 jmsserializerbundle。


0
投票
        $obj = $test;

        $serializer = new Serializer(
            array(new GetSetMethodNormalizer()),
            array('json' => new JsonEncoder())
        );
        $json = $serializer->serialize($obj, 'json');

        $response = new \Symfony\Component\HttpFoundation\Response($json);
        $response->headers->set('Content-Type', 'application/json');
        return $response;

0
投票

我已经在我的存储库类中使用 getArrayResult() 而不是 getResult() 尝试过,它有效


0
投票

当您尝试使用

$name
时,它是有效的,因为它是分配给数组的简单字符串值。所以
json_encode
可以轻松转换它。

但是

findall()
方法会返回
Test
实体对象,所以你不能使用
json_encode
直接将其转换为Json。

从实体对象中,您可以通过 getter 和 setter 方法获取数据。

所以如果您的

Test
实体数据不是太大,那么您可以简单地将实体对象数据映射到数组中,如下所示:

public function index2Action($name)
{   
    $em = $this->getDoctrine()->getEntityManager();
    $tests = $em->getRepository('RestWebServiceBundle:Test')->findAll();

    // Map the Test entities object into an associative array
    $testArray = [];
    foreach ($tests as $test) {
        $testArray[] = [
            'id' => $test->getId(),
            'title' => $test->getTitle(), 
            'author' => $test->getAuthor(),
            ... Add necessary fields data ...
        ];
    }

    return new Response(json_encode(['locations' => $testArray]));
}

您也可以简单地使用

JsonResponse()
方法返回 json 格式的数据,而不是使用
Response
来返回
json_encode()

return new JsonResponse(['locations' => $testArray]);

使用

JsonResponse
,您无需使用
json_encode()
方法手动编码数据。

© www.soinside.com 2019 - 2024. All rights reserved.