使用 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
过滤器。
我在 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
过滤器。