Max Damage Max Damage - 6 months ago 21
JSON Question

Twig with Symfony 2 displaying json encoded variables different between prod and dev

We're building a Symfony 2 application that sends some data from controller to view:

Controller



$user = array(
'configuration' => array(
'levels' => array(
'warning' => 0.05,
'danger' => 0.10,
),
),
);

return $this->render(
'MyWebsiteBundle:Core:searchResults.html.twig',
array(
'userJSON' => json_encode($user)
)
);


View



<script language="javascript">
user = $.parseJSON("{{ userJSON }}");
</script>


Result



On
dev
the result looks like this and works as expected:

user = $.parseJSON("\x7B\x22configuration\x22\x3A\x7B\x22levels\x22\x3A\x7B\x22warning\x22\x3A0.05,\x22danger\x22\x3A0.1\x7D\x7D\x7D");


On the other hand, on
prod
the result is encoded in a different manner, thus displaying errors in console:

user = $.parseJSON("{&quot;configuration&quot;:{&quot;levels&quot;:{&quot;warning&quot;:0.05,&quot;danger&quot;:0.1}}}");


Console Error: Uncaught SyntaxError: Unexpected token &

What generates this difference?

Answer

The "problem" was Twig autoescaping variables. I used Twig's raw filter to skip autoescaping like this:

<script language="javascript">
    user = $.parseJSON('{{ userJSON | raw }}');
</script>

Now it prints:

user = $.parseJSON('{"configuration":{"levels":{"warning":0.05,"danger":0.1}}}');

Links: Symfony 2 Docs - Output escaping

Comments