使用Twig生成JSON

时间:2014-01-28 03:57:22

标签: php jquery json twig

我想要一个返回简单JSON对象的URL。我正在尝试使用Twig生成JSON对象:

{
"urls": [
{% for child in page.root %}
    "{{ child.url }}"{% if not loop.last %},{% endif %}
{% endfor %}
]
}

虽然回车不会留在原地,但我仍然得到一个如下所示的结果:

{'urls':['../ants/','../brick-report/','../the-pollution-intervention/','../barclay/','../broken-advertising/','../aldat-n-densom/','../thisisart/','../there-she-goes-again/']}

哪个Jquery不会用它的ajax或getJSON方法解析。它完全忽略了这个JSON。我怎么能说服Twig把正确的空白放到位呢?我查看了手册,它似乎只关心不插入空格。

7 个答案:

答案 0 :(得分:13)

这对我有用(树枝模板):

var parsedJSON = JSON.parse('{{ ['one', 'two', 'three']|json_encode|e('js') }}');

那:

console.log(parsedJSON);

将输出:

 Array ["one", "two", "three"]

在FF控制台中。

答案 1 :(得分:5)

Twig有一个过滤器。

json_encode,它使用PHP json_encode函数。

适用于您的情况:

{{ {'urls': page.root}|json_encode }}

将输出

{"urls":["..\/ants\/","..\/brick-report\/","..\/the-pollution-intervention\/","..\/barclay\/","..\/broken-advertising\/","..\/aldat-n-densom\/","..\/thisisart\/","..\/there-she-goes-again\/"]}

代码经过测试并正常运行。有关更多信息,请查看json_encode的Twig文档。

答案 2 :(得分:3)

不要使用Twig来生成json响应。

在您的控制器中,使用:

return new Response(json_encode($var));

样品:

public function sampleAction()
{
    $urls = array('../test', '../something', '../sample');
    return new Response(json_encode($var));
}

如果从Symfony2路由生成URL,您可以使用:

public function sampleAction()
{
    $urls = array(
             $this->generateUrl('my_test'),
             $this->generateUrl('my_something'),
             $this->generateUrl('my_sample'),
    );
    return new Response(json_encode($var));
}

答案 3 :(得分:0)

如果你延长枝条,这很容易。

首先,创建一个包含扩展名的类:

<?php

namespace Acme\DemoBundle\Twig\Extension;

use Symfony\Component\DependencyInjection\ContainerInterface;  
use \Twig_Extension;

class VarsExtension extends Twig_Extension
{
    protected $container;

    public function __construct(ContainerInterface $container) 
    {
        $this->container = $container;
    }

    public function getName() 
    {
        return 'some.extension';
    }

    public function getFilters() {
        return array(
            'json_decode'   => new \Twig_Filter_Method($this, 'jsonDecode'),
        );
    }

    public function jsonDecode($str) {
        return json_decode($str);
    }
}

答案 4 :(得分:0)

尝试将模板包装在自动转义块中:

{% autoescape 'js' %}
  { "href": "{{ my_url }}" }
{% endautoescape%}

答案 5 :(得分:0)

通常,通过返回JsonRespnse对象,使控制器直接返回json更有意义

但是,如果您确实需要在Twig中输出JSON并将其分配给变量,则还可以使用:

let foo = {{ bar|json_encode|raw }}

答案 6 :(得分:-1)

基本上 $。getJson()方法需要json但是\ n是一个字符串 所以你可以使用 $。get()来获取响应并使用解析器将字符串解析为JSON

 $.get("ffff",function(data){
 // user parser
 JSON.parse();
 });