32

是否可以在树枝中解码 JSON?谷歌搜索似乎对此没有任何帮助。在 Twig 中解码 JSON 没有意义吗?


我正在尝试访问 Symfony2 的实体字段类型(实体字段类型)上的 2 个实体属性。

在遇到 2 个之前的 SO 问题(Symfony2 entity field type alternatives to "property" or "__toString()"?Symfony 2 Create a entity form field with 2 properties)后,建议向实体添加一个额外的方法来检索自定义字符串而不是实体属性,我想到(并且确实)返回一个表示对象实例的 JSON 字符串。

在实体类的某处:

/**
 * Return a JSON string representing this class.
 */
public function getJson()
{
   return json_encode(get_object_vars($this));
}

并以形式(类似):

$builder->add('categories', 'entity', array (
...
'property' => 'json',
...
));

之后,我希望json_decode它在 Twig 中......

{% for category in form.categories %}
    {# json_decode() part is imaginary #}
    {% set obj = category.vars.label|json_decode() %}
{% endfor %}
4

6 回答 6

42

如果您扩展 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);
    }
}

Services.xml然后,在您的文件中注册该类:

<service id="some_id" class="Acme\DemoBundle\Twig\Extension\VarsExtension">
        <tag name="twig.extension" />
        <argument type="service" id="service_container" />
</service>

然后,在你的树枝模板上使用它:

{% set obj = form_label(category) | json_decode %}
于 2013-01-24T15:33:37.967 回答
7

以上所有内容的替代方案
而且我不知道这是否是最佳解决方案,但它确实有效

1)创建一个辅助函数注册该函数。

<?php
function twig_json_decode($json)
{
    return json_decode($json, true);
}


2)在你的树枝文件中使用这个功能。

{% set res = twig_json_decode(json) %}
# above will return an array which can be iterated

{% for r is res %}
    {{ r }}
{% endfor %}
于 2015-01-16T11:35:15.930 回答
6

我想出了一种获取我的 JSON 的方法,我想我会在这里分享它,以防它对其他人有用。

所以在我的情况下,我可能从 mysql 数据库返回了 10 条记录(布局),并且每一行都有一个名为 properties 的字段,它是一个 json 字符串。因此,我可以轻松地提取记录并将它们发送到模板,如下所示:

echo $twig->render('template.html.twig', array(
      "layouts" => $layouts,
));

到目前为止一切顺利,但是当我在 twig 中执行 {% for layout in layouts %} 时,无法访问属性字段项,因为它们仍然是 json 字符串。

因此,就在我将 $layouts 传递给 twig 模板之前,我执行了以下操作:

foreach($layouts as $i => $v)
{
      $layouts[$i]->decoded = json_decode($v->getProperties());
}

通过这样做,我在我的对象中动态创建了一个名为“decoded”的变量,其中包含 json 解码对象。

所以现在在我的模板中,我可以通过 {{ layout.decoded.whatever }} 访问我的 json 项目

这可能有点 hacky,而且不是每个人都想得到一个好的解决方案。我对我来说工作得很好,开销很小,这意味着我不必在延伸树枝时弄乱它,因为我在它到达模板之前正在做这项工作。

于 2013-06-07T14:25:14.570 回答
4

Symfony2.8 或 Symfony3 的更新代码:

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

    // Note: If you want to use it as {{ json_decode(var) }} instead of 
    // {{ var|json_decode }} please use getFunctions() and 
    // new \Twig_SimpleFunction('json_decode', 'json_decode') 
    public function getFilters() {
        return [
            // Note that we map php json_decode function to 
            // extension filter of the same name
            new \Twig_SimpleFilter('json_decode', 'json_decode'),
        ];
    }
}
于 2016-01-07T18:27:10.687 回答
1

这是一个老问题,但我正在添加我的解决方案以供记录......只需使用 SimpleFunction 扩展 Twig:

// Return a string of separated values from a JSON string
// Can optionally specify a separator.  If none provided, ", " is used.
$function = new Twig_SimpleFunction('json_to_list', function($json, $separator = ", ")
{
    $result = "";
    $array = json_decode($json, true);
    foreach ($array as $item)
    {
        if ($result != "") { $result .= $separator; }           
        $result .= $item;
    }
    return $result;
});
$twig->addFunction($function);

用法:

在调用 Twig 渲染之前将 a_json_variable 设置为字符串 '["1","2","3","4","5"]'。

树枝模板:

The values are: {{ json_to_list(a_json_variable) }}

会产生

The values are: 1, 2, 3, 4, 5
于 2017-11-29T19:12:31.530 回答
0

在我的情况下,我的实体中有一个 JsonArray,然后我在我的实体中添加了一个方法

<?php
namespace ACME\DefaultBundle\Entity;
/*...*/    
public function getDecodedPath()
{
    return json_decode($this->path);
}
于 2016-04-04T07:42:21.920 回答