我在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
呢?
答案 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
过滤器。