2014-01-28 17 views
5

Ich möchte eine URL haben, die ein einfaches JSON-Objekt zurückgibt. Ich versuche Zweig zu verwenden, um das JSON-Objekt zu erzeugen:Verwenden von Twig zum Generieren von JSON

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

Der Wagen kehrt anstelle obwohl bleibt nicht, und ich immer ein Ergebnis erhalten, die wie folgt aussieht:

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

die JQuery werden nicht mit den Methoden ajax oder getJSON analysieren. Es ignoriert dieses JSON total. Wie kann ich Twig davon überzeugen, den richtigen Whitespace einzusetzen? Ich habe mir das Handbuch angeschaut und es scheint nur daran gelegen zu sein, dass kein Leerzeichen eingefügt wird.

+2

Ich wundere mich persönlich, wie die einfachen Anführungszeichen für die doppelten Anführungszeichen in Ihrem Code gehandelt werden. Single quoted json Eigenschaften sind ungültig. Leerraum ist auch keine Voraussetzung für gültige JSON. – Daedalus

+0

Sie haben absolut recht. Ich habe diese Frage zu früh gestellt. Gültiges JSON erfordert das Leerzeichen nicht - es erfordert, dass die Anführungszeichen um den Eigenschaftsnamen des Objekts stehen, was ich nicht getan habe. – russellmania

Antwort

0

Das ist einfach, wenn Sie Zweig verlängern.

Erstens eine Klasse erstellen, die die Erweiterung enthält:

<?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

Bitte fahren Sie mit dieser Antwort fort, indem Sie Ihre Erweiterung abschließen und ein Verwendungsbeispiel angeben, das den OP-Anforderungen entspricht. –

-1

Im Grunde die $ .getJSON() Methode erfordert json aber ther ist ein String so können Sie verwenden $ .get() die Antwort zu erhalten und die Parser verwenden, um die Zeichenfolge zu JSON

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

Zweig hat einen Filter für diese zu analysieren.

json_encode, es verwendet PHP json_encode Funktion.

für Ihren Fall:

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

ausgeben wird

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

der Code getestet und funktioniert. Weitere Informationen finden Sie in der Twig Documentation für json_encode.

4

Verwenden Sie Twig nicht zum Generieren Ihrer JSON-Antwort.

In Ihrem Controller verwenden:

return new Response(json_encode($var)); 

Probe:

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

Wenn URLs von Symfony2 Routen generiert werden, können Sie:

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

Das ist nicht geeignet, wenn man bereits einen Zweig benutzt, um eine Antwort zu konstruieren. – RichieHH

9

Das funktioniert für mich (Zweig Vorlage):

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

Und das:

console.log(parsedJSON); 

AUSGABE:

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

in FF-Konsole.

Verwandte Themen