这是我的控制器
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
我强烈建议您使用序列化器来返回实体。查看序列化器组件或 jmsserializerbundle。
$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;
我已经在我的存储库类中使用 getArrayResult() 而不是 getResult() 尝试过,它有效
当您尝试使用
$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()
方法手动编码数据。