symfony - 如何使用 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 文档没有多大帮助。
解决方案
所以这是一种解决方案。
我将数组封装在 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 结构。
推荐阅读
- sql - 我如何用来自 3 个不同表的数据填充我的表?
- java - Mysql 服务器将 LocalDateTime 保存在操作系统时间之外 3 小时
- c++ - 如何使用 C++ 在 OpenCv 中准确检测三角形
- python - AttributeError:找不到 PyAudio;检查安装...无法使用语音识别
- python - 定义一个函数来搜索文本文件中的特定单词并打印总行数
- python-3.x - 在 atom 中运行 python 脚本
- python - 如何使用连接到“登录”按钮的“LoginF”功能创建验证用户名和密码的应用程序
- azure - Azure API 管理无法使用 azure b2c 进行授权:签名失败
- html - 如何在图像的中心显示文本,其中有 2 行图像,每行 4 个图像
- sql - 根据条件创建新行 - Oracle SQL