首页 > 解决方案 > 如何使用 Symfony Serializer 在 XML 序列化中正确分组数组

问题描述

我现在有一个在 symfony 4.4 上运行的项目,它需要在几个端点中以 XML 格式返回数据。

所以我一直在尝试序列化一个包含来自另一个实体的对象数组的实体,就像这样

public class Ticket {
    private string $uuid;

    /** @var Product[]|array $products **/
    private array $products;
    
}

和产品类别:

public class Product {
    private string $uuid;
    private DateTime $startDate;
    *... getters and setters...*
}

我希望响应是这样的:

<ticket>
    <uuid>1234567890</uuid>
    <products>
        <product>
            <uuid>PROD_CAM_1</uuid>
            <startDate>2020-01-04</startDate>
        </product>
        <product>
            <uuid>PROD_CAP_2</uuid>
            <startDate>2019-04-21</startDate>
        </product>
     </products>
</ticket>

但我反而得到:

<ticket>
    <uuid>1234567890</uuid>
    <product>
        <uuid>PROD_CAM_1</uuid>
        <startDate>2020-01-04</startDate>
    </product>
    <product>
        <uuid>PROD_CAP_2</uuid>
        <startDate>2019-04-21</startDate>
    </product>
</ticket>

我的序列化程序配置没什么特别的,我在 services.yaml 中指定的唯一内容是在日期时间上下文中:

    Symfony\Component\Serializer\Normalizer\DateTimeNormalizer:
    arguments:
        $defaultContext:
            datetime_format: 'Y-m-d'

我只是将序列化程序服务注入我的控制器,然后执行以下操作以转换为 xml:

$this->serializer->serialize($data,'xml',['xml_encoding' => 'utf-8']);

其中 $data 是 Ticket 数组

我错过了什么?symfony 文档没有多大帮助。

标签: symfony

解决方案


所以这是一种解决方案。

我将数组封装在 Products 类上,因此实体保留为:

public class Ticket {
    private string $uuid;

    /** @var Products $products **/
    private Products $products;
}

新的 Products 类保留为:

class Products
{
    /**
     * @var array $products
     * @SerializedName("product")
     */
    private array $products = [];

    /**
     * @return array
     */
    public function getProducts(): array
    {
        return $this->products;
    }

    /**
     * @param array $products
     */
    public function setProducts(array $products): void
    {
        $this->products = $products;
    }

    public function addProduct(Product $product): void
    {
        $this->products[] = $product;
    }
}

其他一切都保持不变,这将输出所需的 XML 结构。


推荐阅读