使用 JSON.stringify 显示 Twig 变量

Display Twig variable using JSON.stringify

我在 Silex 应用程序中有一个函数执行 cURL 语句和 returns JSON 字符串,该字符串被分配给变量 curl_result。然后将此变量传递到 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 它?

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

如果你想使用 json_encode 来漂亮地打印这个数据,你首先需要解码这个字符串(正是你在 JSON.parse 的替代解决方案中所做的),然后用漂亮的编码打印选项。所以在你的控制器中你应该有这样的改变:

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

然后您可以使用 json_encode 在您的 twig 文件中按照您在第二个 twig 片段中尝试的方式漂亮地打印 curl_result

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

或者,您可以将 $result 作为 JS 变量打印在您的 twig 模板文件中,如下所示:

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

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