PHP json_decode使用Symfony返回null

时间:2018-11-25 17:58:02

标签: php json rest api symfony

我正在使用Symfony处理REST API,但是我的json_decode函数的数组返回null。我已经看到他在编码方面可能会遇到问题,但我不确定。 这是我的json:

{
    "id": 1,
    "title": "Titre",
    "content": "Contenu",
    "vendeur": null
}

这是我的序列化和解码json的功能:

/**
 * @Route("/api_articles_list", name="api_articles_list")
 * @Method({"GET"})
 */

public function showActionListSerialize()

{

    $articles =   $this->getDoctrine()->getRepository('AppBundle:Article')->findAll();

   // return new JsonResponse(array('articles' => $articles));

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

    $response = new Response($data);

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


    return $response;



}

/**
 * @Route("/api_articles_list/articles_list", name="articles_list")
 * @Method({"GET"})
 */
public function showActionList()

{

    $articles = json_decode(utf8_encode($this->showActionListSerialize()), true);

    var_dump($articles);
    return $this->render('listeArticles.html.twig', array('articles' => $articles));

}

2 个答案:

答案 0 :(得分:1)

您正在尝试对数组进行编码,请在对列表进行序列化后放置encode函数:

/**
 * @Route("/api_articles_list", name="api_articles_list")
 * @Method({"GET"})
 */

public function showActionListSerialize()

{

    $articles =   $this->getDoctrine()->getRepository('AppBundle:Article')->findAll();

   // return new JsonResponse(array('articles' => $articles));

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

    $response = new Response(utf8_encode($data));

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


    return $response;



}

/**
 * @Route("/api_articles_list/articles_list", name="articles_list")
 * @Method({"GET"})
 */
public function showActionList()

{

    $articles = json_decode($this->showActionListSerialize(), true);

    var_dump($articles);
    return $this->render('listeArticles.html.twig', array('articles' => $articles));

}

答案 1 :(得分:1)

首先,欢迎使用StackOverflow

您的第二个控制器应该看起来像这样以实现您的目标:

/**
 * @Route("/api_articles_list/articles_list", name="articles_list")
 * @Method({"GET"})
 */
public function showActionList()
{
    $articles = json_decode(utf8_encode($this->showActionListSerialize()->getContent()), true);

    var_dump($articles);

    return $this->render('listeArticles.html.twig', array('articles' => $articles));

}

不是必须首先使用utf8_encode。然后,您的方法 showActionListSerialize 返回HttpFoundation Response 对象。

当您使用如下序列化的数据来实例化响应时:

$response = new Response($data);

实际上与这样做相同:

$response->setContent($data);

因此,要访问JSON数据,您需要 getContent 方法。

的实际输出

var_dump(utf8_encode($this->showActionListSerialize());

是:

  

HTTP / 1.0 200 OK缓存控制:无缓存,私有Content-Type:   application / json日期:2018年11月26日星期一13:25:22 GMT   [{“ content”:“ Lorem   ipsum“,” vendeur“:” test_vendeur“,” id“:1,” title“:” title_test“}]”“

和输出

var_dump(utf8_encode($this->showActionListSerialize()->getContent());

  

[{“ content”:“ Lorem   ipsum“,” vendeur“:” test_vendeur“,” id“:1,” title“:” title_test“}]

此解决方案应为您工作。您的树枝模板应如下所示:

{% block body %}
    {% for article in articles %}
        <br>
        id: {{ article.id }} <br>
        title: {{ article.title }}<br>
        content: {{ article.content }}<br>
        vendeur: {{ article.vendeur }}
    {% endfor %}
{% endblock %}