Symfony 2.7 + JMS Serializer + MaxDepth

问题描述 投票:2回答:2

我正在使用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": [{}, {}]
}

对于发生了什么有什么想法?

谢谢!

symfony jmsserializerbundle
2个回答
4
投票

我遇到了类似的问题并修复了这种方式:

在学生班:

/**
 * @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被序列化,这正是我所需要的!


1
投票

当我曾经遇到类似问题时,它是由于在子实体中没有使用相同的序列化程序组引起的,所以它给出了一个空对象(没有序列化的属性)

© www.soinside.com 2019 - 2024. All rights reserved.