You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:05:10