【问题标题】:Symfony 2.7 + JMS Serializer + MaxDepthSymfony 2.7 + JMS 序列化器 + MaxDepth
【发布时间】:2015-10-06 15:38:44
【问题描述】:

我正在使用 JMS Serializer 包将 Symfony 实体序列化为 json。 一切正常,直到我开始使用 MaxDepth 注释来避免深度递归。

我有一个名为“Category”的实体,它有“Subcategories”,如果我在序列化它时不使用 MaxDepth 注释,它可以完美地工作并生成一个 json 对象,它应该是完整的树子类别:

{
    "id": 1,
    "name": "Category 1",
    "subcategories": [{
        "id": 3,
        "name": "Category 1-1",
        "subcategories": [{
            "id": 7,
            "name": "Category 1-1-1",
            "subcategories": []
        }]
    }, {
        "id": 4,
        "name": "Category 1-2",
        "subcategories": []
    }]
}

我希望只序列化第一级子类别,因此我尝试以这种方式配置我的实体:

class Category
{
    ....

    /**
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parentCategory")
    * @MaxDepth(1) 
    */
    private $subcategories;    

    ....    

}

但由于某种原因,我不明白何时启用 maxdepth 检查,使用以下代码:

$serializedObj = $jms->serialize($obj, 'json', SerializationContext::create()->enableMaxDepthChecks());

我得到了这个奇怪的结果(没有编码子类别,但它知道有两个):

{
    "id": 1,
    "name": "Categoria 1",
    "subcategories": [{}, {}]
}

知道发生了什么吗?

谢谢!

【问题讨论】:

  • 您是否尝试设置@MaxDepth(2) ?
  • 我也遇到了同样的问题。我要疯了,因为 MaxDepth 注释不起作用(是的,我有 serializerEnableMaxDepthChecks=true)。
  • Lexxx 是正确的。在子实体中,您必须设置与传入 setGroups() 参数相同的组(在控制器方法中)
  • 嘿,感谢您的精彩回复。可以在hole class上提到@MaxDepth吗??

标签: symfony jmsserializerbundle


【解决方案1】:

我遇到了类似的问题,解决方法是这样的:

在学生类中:

/**
 * @ORM\ManyToOne(targetEntity="school", inversedBy="student")
 * @ORM\JoinColumn(name="school_id", referencedColumnName="id")
 * @JMS\Serializer\Annotation\MaxDepth(2)
 */
protected $school;

在学生控制器中:

/**
 * @FOS\RestBundle\Controller\Annotations\View(serializerEnableMaxDepthChecks=true)
 */
public function getStudentsAction() {
    $students = $this->getDoctrine()
    ->getRepository('AppBundle:Student')
    ->findAll();
    return $students;
}

school 没有任何内容被序列化,这正是我需要的!

【讨论】:

  • 嘿,感谢您的精彩回复。可以在hole class上提到@MaxDepth吗??
  • 不幸的是,我认为只能将 MaxDepth 注释添加到属性中,但我可能错了。
【解决方案2】:

我曾经遇到过类似的问题,是因为子实体中没有使用同一个序列化组,所以给了一个空对象(没有序列化属性)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多