我们正在构建一个Symfony 2应用程序,它将一些数据从控制器发送到视图:
$user = array(
'configuration' => array(
'levels' => array(
'warning' => 0.05,
'danger' => 0.10,
),
),
);
return $this->render(
'MyWebsiteBundle:Core:searchResults.html.twig',
array(
'userJSON' => json_encode($user)
)
);
<script language="javascript">
user = $.parseJSON("{{ userJSON }}");
</script>
在dev
上,结果如下所示并按预期工作:
user = $.parseJSON("\x7B\x22configuration\x22\x3A\x7B\x22levels\x22\x3A\x7B\x22warning\x22\x3A0.05,\x22danger\x22\x3A0.1\x7D\x7D\x7D");
另一方面,在prod
上,结果以不同的方式编码,从而在控制台中显示错误:
user = $.parseJSON("{"configuration":{"levels":{"warning":0.05,"danger":0.1}}}");
控制台错误:未捕获的SyntaxError:意外的令牌&amp;
是什么产生了这种差异?
答案 0 :(得分:19)
编辑:另请查看@ Lulhum的解决方案。如果它更好的话就向上投票,所以我会选择它作为正确的答案。
“问题”是Twig autoescaping变量。我使用Twig的raw
过滤器来跳过这样的自动转换:
<script language="javascript">
user = $.parseJSON('{{ userJSON | raw }}');
</script>
现在打印:
user = $.parseJSON('{"configuration":{"levels":{"warning":0.05,"danger":0.1}}}');
答案 1 :(得分:4)
最好尽可能避免使用raw
过滤器。您可以使用escape
过滤器(doc)来实现相同的行为。
<script language="javascript">
user = $.parseJSON('{{ userJSON | escape('js') }}');
</script>