2014-01-28 33 views
5

我想擁有一個返回簡單JSON對象的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把正確的空白放在適當的位置?我看過手冊,它似乎只關注不插入空格。

+2

我個人想知道單引號如何在代碼中用雙引號進行交易..單引號json屬性是無效的。此外,空白不是有效json的要求。 – Daedalus

+0

你是對的。我太早問了這個問題。有效的JSON不需要空白 - 它確實需要引號包含對象的屬性名稱,而我並沒有這樣做。 – russellmania

回答

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); 
    } 
} 
+0

請繼續此答案,完成您的擴展並提供符合OP要求的使用示例。 –

-1

基本上$ .getJson()方法需要JSON但是療法是一個字符串 所以你可以使用$獲得()獲得響應,並使用分析器來分析字符串以JSON

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

嫩枝有一個過濾器這一點。

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的枝條文檔。

4

不要使用Twig來生成你的json響應。

在你的控制器,使用方法:

return new Response(json_encode($var)); 

樣品:

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

如果URL將從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

當已經使用樹枝構建響應時,這並不合適。 – RichieHH

9

這對我的作品(樹枝模板):

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

這:

console.log(parsedJSON); 

將輸出:

在FF控制檯
Array ["one", "two", "three"]