【问题标题】:How to properly group array in XML Serialization using Symfony Serializer如何使用 Symfony Serializer 在 XML 序列化中正确分组数组
【发布时间】:2021-10-20 07:50:01
【问题描述】:

我现在有一个在 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


    【解决方案1】:

    所以这是一种解决方案。

    我将数组封装在 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 结构。

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2019-05-29
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多