使用Twig生成JSON

问题描述 投票:7回答:6

我想用一个URL来返回一个简单的JSON对象。我试图使用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把正确的whitespace放进去呢?我看了一下手册,它似乎只关心不插入空格的问题。

php jquery json twig
6个回答
13
投票

这对我来说是可行的(twig模板)。

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

还有:

console.log(parsedJSON);

会输出:

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

在FF控制台上。


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\/"]}

代码已经过测试并能正常工作。更多信息请看Twig文档中的 json_encode.


3
投票

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

在你的控制器中,使用:

return new Response(json_encode($var));

Sample:

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

如果URLs是由Symfony2路由生成的,你可以使用:

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

0
投票

如果你扩展了twig,那就简单了

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

<?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);
    }
}

0
投票

试着把你的模板包装在一个autoescape块中。

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

-1
投票

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

 $.get("ffff",function(data){
 // user parser
 JSON.parse();
 });
© www.soinside.com 2019 - 2024. All rights reserved.