JMS Serializer仅能通过额外标签反序列化XML?求正确配置方案
解决JMS Serializer反序列化根标签为的XML为空问题
方案一:通过实体类注解配置
假设你有一个Items类用于包裹商品列表,核心是给集合属性添加inline=true的XmlList注解,同时指定根标签:
namespace App\Entity; use JMS\Serializer\Annotation as Serializer; /** * @Serializer\XmlRoot("items") */ class Items { /** * @Serializer\XmlList(inline = true, entry = "item") * @Serializer\Type("array<App\Entity\Item>") */ private array $items = []; // 生成对应的getter/setter方法 public function getItems(): array { return $this->items; } public function setItems(array $items): void { $this->items = $items; } }
然后反序列化代码保持常规写法即可:
use JMS\Serializer\SerializerBuilder; $serializer = SerializerBuilder::create()->build(); $itemsObject = $serializer->deserialize($xmlContent, Items::class, 'xml');
方案二:直接反序列化为Item数组
如果你不需要Items包裹类,可以直接将XML反序列化为Item对象数组,只需在反序列化时指定根节点名称:
首先确保Item类的注解正确:
namespace App\Entity; use JMS\Serializer\Annotation as Serializer; /** * @Serializer\XmlRoot("item") */ class Item { /** * @Serializer\XmlElement(cdata=false) * @Serializer\Type("string") */ private ?string $title = null; // 其他属性及对应getter/setter }
然后反序列化时传入上下文参数指定根标签:
$context = [ 'xml_root_node_name' => 'items', ]; $itemsArray = $serializer->deserialize($xmlContent, 'array<App\Entity\Item>', 'xml', $context);
关键原因说明
你之前得到空对象,是因为JMS Serializer默认期望集合嵌套在与属性名同名的子标签下(比如<items><items><item>...</item></items></items>),而XmlList(inline=true)会告诉序列化器直接将<item>元素放在根标签<items>下,无需额外嵌套层。
内容的提问来源于stack exchange,提问作者MadCatERZ
相关产品推荐
相关产品推荐

