【问题标题】:How to serialize specific attributes of nested object in symfony?如何在 symfony 中序列化嵌套对象的特定属性?
【发布时间】:2019-12-08 22:41:22
【问题描述】:

我有 2 个实体具有多对多关系 Author 和 Book。

现在,当我将 Book 序列化为 json 时,它会为我提供嵌套作者对象的所有字段。


{
    "id": 3,
    "name": "clean code",
    "authors": [
        {
            "id": 4,
            "name": "Martin Robert "
        },
        ...
    ]
}

但是如何让它只返回特定的字段,例如每个作者的名字。

我尝试将组添加到作者实体,但是当我运行序列化程序时,组似乎不适用于嵌套对象,因为我得到了相同的结果。

    $book=$this->serializer->normalize($book, null, ['groups' => 'Concise']);
    $book=$this->serializer->serialize($book,'json');

【问题讨论】:

  • 序列化器组是这样做的方法。我不知道为什么在您的情况下它似乎不起作用。此外,您不必在“序列化”之前“规范化”您的书。您可以直接序列化您的实体。也许它与您的问题有关。

标签: php symfony serialization


【解决方案1】:

你应该看看JMS Serializer,它是一个强大的序列化对象库,你可以通过配置哪些字段应该保留在序列化中,轻松地在你的实体上使用@Groups注解来完成你的要求过程。

Book.php

use JMS\Serializer\Annotation\Groups;

class Book {
  /** @Groups({"Concise"}) */
  private $id;

  /** @Groups({"Concise"}) */
  private $name;

  /** @Groups({"Concise"}) */
  private $authors;

  ...
}

如果您只想在序列化书籍实体时检索作者姓名,只需在名称字段上放置@Groups 注释。

作者.php

use JMS\Serializer\Annotation\Groups;

class Author {
  private $id;

  /** @Groups({"Concise"}) */
  private $name;

  private $books;

  ...
}

那么

use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\SerializationContext;


$serializer = SerializerBuilder::create()->build();
$context = SerializationContext::create()->setGroups(array('Concise'));
$json = $serializer->serialize($book, 'json', $context);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2021-09-21
    • 1970-01-01
    • 2017-07-07
    • 2020-12-20
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多