如何使用来自API平台的JSON

sky*_*ner 3 json twig api-platform.com symfony-3.4

我已经在服务器上安装了api平台演示,并且做了一个客户端应用程序(与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}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器的方法:

 //...
 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
    ));
}
Run Code Online (Sandbox Code Playgroud)

我也试着json_decode和使用JMSSerializer上$ listBooks。我有一个漂亮的对象,但仍然无法通过执行类似的操作来访问JSON属性(如ISBN),标题

 {% for book in listBooks %}
      {{ dump(book.title) }}
       <!-- .... -->
 {% endfor %}
Run Code Online (Sandbox Code Playgroud)

这是当我json_decode $ listBooks时得到的:

  {{ dump(listBooks) }}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

当我尝试访问每个字段时出现错误

  {{ dump(listBooks.@id) }}
  {{ dump(listBooks['hydra:member']) }}
  ....
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?

谢谢

mar*_*ias 5

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

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

{{ attribute(listBooks, 'hydra:member') }}
Run Code Online (Sandbox Code Playgroud)

另一种方法是这样$listBooks = json_decode($listBooks, true);做,以获得关联数组而不是对象。然后,您可以在Twig中使用括号表示法:

{{ listBooks['hydra:member'] }}
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种方法,因为我认为{{ listBooks['hydra:member'] }}它比清晰得多{{ attribute(listBooks, 'hydra:member') }}