【问题标题】:How to work with JSON coming from api-platform如何使用来自 api-platform 的 JSON
【发布时间】: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']) }}等。

标签: json twig symfony-3.4 api-platform.com


【解决方案1】:

$dataBooks-&gt;getBody()-&gt;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') }} 更清晰、更干净。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2018-06-28
    • 2020-02-09
    • 2020-04-23
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多