如何使用来自 api-platform 的 JSON
Posted
技术标签:
【中文标题】如何使用来自 api-platform 的 JSON【英文标题】:How to work with JSON coming from api-platform 【发布时间】:2018-07-27 11:41:56 【问题描述】:我已经在服务器上安装了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。 我得到了一个漂亮的对象,但我仍然无法访问 JSON 属性,如 ISBN,标题通过执行类似
的操作 % for book in listBooks %
dump(book.title)
<!-- .... -->
% endfor %
这是我在 json_decode $listBooks 时得到的:
dump(listBooks)
当我尝试访问这样的每个字段时出现错误
dump(listBooks.@id)
dump(listBooks['hydra:member'])
....
我错过了什么吗?
谢谢
【问题讨论】:
您应该考虑将图像替换为“真实”文本。更易于阅读和理解。 dump(book)
在for
循环中给你什么?
你试过listBooks['hydra:member']中的书吗?似乎书籍数组是 hydra:member。
@martias : 它什么也没给我
试试json_decode($listBooks, true);
这样你会得到一个关联数组而不是一个对象。然后你也许可以做 dump(listBooks['hydra:member'])
等。
【参考方案1】:
$dataBooks->getBody()->getContents();
返回一个字符串,如Guzzle's documentation中所述,所以需要使用json_decode
。
$listBooks = json_decode($listBooks);
返回一个对象。在 Twig 中,您可以使用点符号来访问对象的方法和属性,例如 listBooks.myProp
。但是因为hydra:member
包含一个特殊字符(:
),所以需要使用Twig's attribute
function,如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 的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何在 api-platform 中拦截 graphql 请求?
如何在 Api-Platform 中为虚拟属性引入过滤功能?
api-platform 可以将 200 返回到 POST 吗?