如何在twig文件中使用php json_encode选项与json_encode twig函数

35

我正在尝试使用twig的json_encode函数,但是当我这样做时

    var packageDetails =  {{(packageDetails|json_encode)}};

而 packageDetails 是从控制器传递的数组的数组。

它会给我一个错误提示:

    invalid property id 

由于出现了特殊字符 ",所以我想使用转义过滤器;那么如何使用它呢?

3个回答

66

是因为你没有将输出用引号括起来吗?

var variable = '{{{reference}}}';

更新:

根据评论,解决该问题的实际答案是在标签中添加|raw。

var packageDetails =  {{(packageDetails|json_encode|raw)}};

1
如果我将输出用引号括起来,就无法得到JSON对象。 当我使用console.log时,我得到的是{"college":.... - aditya
我想让我的JS变量存储一个对象,以便我可以循环遍历它。 - aditya
7
如果您的字符串包含单引号(')符号,JavaScript会无法解析。使用"escape('js')" twig过滤器可以避免该问题。因此,我建议使用以下代码: var variable = '{{reference | json_encode | escape('js') | raw}}'; - paulgreg
1
遇到了相同的“问题”,所以这个原始评论解救了我。谢谢! - Alec
@paulgreg 这里你真的需要使用 | raw 吗? - Michon

44

您可以按照以下方式添加选项:

{{ data|json_encode(constant('JSON_PRETTY_PRINT'))|raw }}

我加上这个回答是因为它回答了你标题中的问题,但听起来原始过滤器才是你真正需要的。尽管如此,其他人可能会发现这很有用。

因为它回答了你标题中的问题,所以我加上了这个回答,但看起来你真正需要的是原始过滤器。不过,其他人可能也会觉得这个回答有用。


1
使用原始过滤器不会对XSS攻击造成危险吗? - Frank6
2
@Frank6:这要看data来自哪里;如果是来自你自己的数据库查询或类似方式,那么它就很安全。但如果是来自用户输入的数据,则在传递给Twig视图之前应对其进行净化处理。 - MidnightLightning
好的!现在它不再给我“JSON 中意外的令牌位置”错误。请将JSON.parse('{{ cats|json_encode|raw }}');替换为{{ cats|json_encode(constant('JSON_PRETTY_PRINT'))|raw }} - Savoo

4

如果你遇到了 Blade / Laravel5.x 相关的问题,以下内容可能会对你有所帮助。

var v = JSON.parse('{!! $v !!}');

该变量是$v还是仅仅是一个参数。 即使不使用Laravel或blade,答案也不清楚。 - Mbotet
你真的认为我还记得4年前给出的答案吗? ;) - everyman
也许不是,但是任何阅读此内容并且熟悉Blade / Laravel5.x的人都可以回答这个问题。 - Mbotet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接