如何处理来自api-platform的JSON数据

5
我已在服务器上安装了api-platform演示,并创建了一个使用Symfony 3.3的客户端应用程序,我想在传统视图(Twig)中显示响应结果。
一切都很好:我可以请求并检索响应。
但这就是我的瓶颈所在:当我将响应转储到我的视图中时,我得到了这个:
 {"@context":"\/contexts\/Book","@id":"\/books","@type":"hydra:Collection","hydra:member":[{"@id":"\/books\/1","@type":"Book","id":1,"isbn":"9783161484100","title":"1st Book","description":"This is my first book synopsis","author":"Hemingroad","publicationDate":"2018-02-16T14:15:58+00:00","reviews":[]}],"hydra:totalItems":1}

这是我的控制器方法:

 //...
 use GuzzleHttp\Client;

public function newAction(Request $request)
{
     //initialize client API
    $client = new Client([
        'base_uri' => 'http://my.apidomain.com/',
        'timeout'  => 2.0,
    ]);

    //request to API
    $dataBooks = $client->request('GET', 'books', ['auth' => ['login', 'p@$$w0rd']]);
    $listBooks = $dataBooks->getBody()->getContents();
    return $this->render('book/new.html.twig', array(
        'listBooks'   => $listBooks
    ));
}

我还尝试过对$listBooks进行json_decode和使用JMSSerializer,得到了一个美丽的对象,但是我仍然无法通过类似于访问JSON属性的方式访问ISBN、标题等。

 {% for book in listBooks %}
      {{ dump(book.title) }}
       <!-- .... -->
 {% endfor %}

当我使用json_decode对$listBooks进行解析时,我得到了以下结果:

  {{ dump(listBooks) }}

在此输入图片描述

当我尝试像这样访问每个字段时,出现了错误:

  {{ dump(listBooks.@id) }}
  {{ dump(listBooks['hydra:member']) }}
  ....

我有什么遗漏吗?谢谢。

1
你应该考虑用“真实”的文本替换图片。这样更容易阅读和理解。 - KungWaz
for 循环中使用 {{ dump(book) }} 会给你什么信息? - Matias Kinnunen
$dataBooks->getBody()->getContents(); 返回一个字符串 (来源),所以你可能需要使用 json_decode。你说它不起作用;为什么?如果你执行 $listBooks = json_decode($listBooks); 然后在 Twig 中使用 dump,你会得到什么? - Matias Kinnunen
1
尝试使用json_decode($listBooks, true);,这样你就可以得到一个关联数组而不是对象。然后你可能能够执行{{ dump(listBooks['hydra:member']) }}等操作。 - Matias Kinnunen
太好了!我上电脑时会处理的,谢谢。 - Matias Kinnunen
显示剩余5条评论
1个回答

7

$dataBooks->getBody()->getContents(); 返回一个字符串,如Guzzle的文档所述,因此您需要使用json_decode

$listBooks = json_decode($listBooks); 返回一个对象。在Twig中,您可以使用点表示法来访问对象的方法和属性,例如{{ listBooks.myProp }}。但是,由于hydra:member包含一个特殊字符(:),因此您需要使用Twig的attribute函数,如Twig的文档所述:

{{ attribute(listBooks, 'hydra:member') }}

另一种方法是执行$listBooks = json_decode($listBooks, true);,以便获得关联数组而不是对象。然后您可以在Twig中使用方括号表示法:
{{ listBooks['hydra:member'] }}

我更倾向于第二种方法,因为在我看来,{{ listBooks['hydra:member'] }}{{ attribute(listBooks, 'hydra:member') }} 更清晰、更简洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接