使用JSON.stringify显示Twig变量

时间:2018-07-14 13:25:54

标签: json twig pretty-print

我在Silex应用程序中有一个函数,该函数执行cURL语句并返回分配给变量curl_result的JSON字符串。然后将此变量传递到Twig模板中,如下所示:

return $twig->render('http.html.twig', ['curl_result' => $result]);

在Twig模板中,我可以通过使用以下命令显示JSON字符串变量:

{% if curl_result is defined %}
  <pre>{{ curl_result }}</pre>
{% endif %}

产生以下结果:

{"ServiceAccount":[{"Type":"MATTER","ID":[{"body":"1980933400...

或者,当我使用JSON_PRETTY_PRINT时:

{% if curl_result is defined %}
    <pre>{{ curl_result|json_encode(constant('JSON_PRETTY_PRINT')) }}</pre>
{% endif %}

唯一的效果似乎是将JSON字符串放在双引号中,并转义了内部的双引号:

"{\"ServiceAccount\":[{\"Type\":\"MATTER\",\"ID\":[{\"body\":\"1980933400...

这些都不以可用方式显示JSON。我希望JSON以人类可读的格式显示,并为此目的使用JSON.stringify。我可以使用以下JavaScript代码和JSON.stringify这样的一些随机文本:

<script>
  var jsonString = '{"some":"json"}';
  var jsonPretty = JSON.stringify(JSON.parse(jsonString),null,2);
  output(jsonPretty);
</script>

如果您仍然与我在一起,这是我的问题:如何将Twig变量curl_result带入javascript中,以便可以JSON.stringify呢?

1 个答案:

答案 0 :(得分:1)

在您的控制器$result中,是一个字符串,它包含一个JSON字符串,但目前仅是一个字符串。因此,当您将其传递给json_encode时,它会转义所有双引号,因为它想编码一个简单的字符串。

如果您想使用json_encode来漂亮地打印此数据,则首先需要解码该字符串(与您在JSON.parse的替代解决方案中所做的完全一样),然后使用漂亮的打印选项对其进行编码。因此,在您的控制器中,您应该进行以下更改:

return $twig->render('http.html.twig', ['curl_result' => json_decode($result)]);

然后,您可以使用json_encode在树枝文件中漂亮地打印curl_result,就像您在第二个树枝片段中尝试的一样:

{% if curl_result is defined %}
    <pre>{{ curl_result|json_encode(constant('JSON_PRETTY_PRINT')) }}</pre>
{% endif %}

或者,您可以像下面这样在树枝模板文件中将$result打印为JS变量:

<script>
      var jsonString = '{{ curl_result | raw }}';
      var jsonPretty = JSON.stringify(JSON.parse(jsonString),null,2);
      console.log(jsonPretty);
</script>

请注意在打印json字符串时使用raw过滤器。