如何与来自 api-platform 的 JSON 一起工作
How to work with JSON coming from api-platform
我已经在服务器上安装了 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
));
}
我也尝试过 json_decode 并在 $listBooks 上使用 JMSSerializer。
我得到了一个漂亮的 object,但我仍然无法通过
之类的操作访问 JSON 属性,如 ISBN、标题
{% for book in listBooks %}
{{ dump(book.title) }}
<!-- .... -->
{% endfor %}
这是我在 json_decode $listBooks 时得到的:
{{ dump(listBooks) }}
当我尝试像这样访问每个字段时出现错误
{{ dump(listBooks.@id) }}
{{ dump(listBooks['hydra:member']) }}
....
我错过了什么吗?
谢谢
$dataBooks->getBody()->getContents();
returns 一个字符串,如 Guzzle's documentation, so you need to use json_decode
.
中所述
$listBooks = json_decode($listBooks);
returns 一个对象。在 Twig 中,您可以使用点符号来访问对象的方法和属性,例如{{ listBooks.myProp }}
。但是因为hydra:member
包含一个特殊字符(:
),所以需要使用Twig's attribute
function, as described in Twig's documentation:
{{ attribute(listBooks, 'hydra:member') }}
另一种方法是执行 $listBooks = json_decode($listBooks, true);
以便您获得关联数组而不是对象。然后你可以在Twig中使用括号表示法:
{{ listBooks['hydra:member'] }}
我更喜欢第二种方法,因为在我看来 {{ listBooks['hydra:member'] }}
比 {{ attribute(listBooks, 'hydra:member') }}
.
更清晰、更清晰
我已经在服务器上安装了 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
));
}
我也尝试过 json_decode 并在 $listBooks 上使用 JMSSerializer。 我得到了一个漂亮的 object,但我仍然无法通过
之类的操作访问 JSON 属性,如 ISBN、标题 {% for book in listBooks %}
{{ dump(book.title) }}
<!-- .... -->
{% endfor %}
这是我在 json_decode $listBooks 时得到的:
{{ dump(listBooks) }}
当我尝试像这样访问每个字段时出现错误
{{ dump(listBooks.@id) }}
{{ dump(listBooks['hydra:member']) }}
....
我错过了什么吗?
谢谢
$dataBooks->getBody()->getContents();
returns 一个字符串,如 Guzzle's documentation, so you need to use json_decode
.
$listBooks = json_decode($listBooks);
returns 一个对象。在 Twig 中,您可以使用点符号来访问对象的方法和属性,例如{{ listBooks.myProp }}
。但是因为hydra:member
包含一个特殊字符(:
),所以需要使用Twig's attribute
function, as described in Twig's documentation:
{{ attribute(listBooks, 'hydra:member') }}
另一种方法是执行 $listBooks = json_decode($listBooks, true);
以便您获得关联数组而不是对象。然后你可以在Twig中使用括号表示法:
{{ listBooks['hydra:member'] }}
我更喜欢第二种方法,因为在我看来 {{ listBooks['hydra:member'] }}
比 {{ attribute(listBooks, 'hydra:member') }}
.