我想将 XML-Feed 反序列化为对象列表。这是我的课程
namespace App\Test;
use JMS\Serializer\SerializerInterface;
class Test
{
public function __construct(private readonly SerializerInterface $serializer)
{
}
public function test()
{
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<items>
<item><id>1</id></item>
<item><id>2</id></item>
</items>
';
$o = $this->serializer->deserialize($xml, Items::class, 'xml');
dump($o);
}
}
namespace App\Test;
use JMS\Serializer\Annotation as Serializer;
class Items {
#[Serializer\Type(ItemList::class)]
#[Serializer\SerializedName('items')]
protected ItemList $items;
}
namespace App\Test;
use JMS\Serializer\Annotation as Serializer;
class ItemList {
#[Serializer\XmlList(entry: 'item', inline: true)]
#[Serializer\Type('array<App\Test\Item>')]
protected array $items;
}
namespace App\Test;
use JMS\Serializer\Annotation as Serializer;
class Item {
#[Serializer\SerializedName('id')]
protected int $id;
}
当我运行 Test.php 时,它转储一个空的 Items 对象。 但是当我向 XML 添加额外的标签时,它就起作用了
$xml = '<?xml version="1.0" encoding="UTF-8"?><X>
<items>
<item><id>1</id></item>
<item><id>2</id></item>
</items> </X>
';
使用这个附加标签是一种非常肮脏的黑客行为,那么我该如何配置我的设置呢? 使用这个:如何将 XML 反序列化为包含 php Symfony 中数组集合的对象 也没有帮助我。 我正在使用 Symfony 版本 6.3.4
我在 Items 和 ItemList 类中进行了主要更改。
在 Items 类中,打开一个名为 getItems 的方法,该方法使用 ItemList 并返回项目列表。这将导致 JMS Serializer 在尝试反序列化 Items 时使用 getItems,而不是尝试直接访问 ItemList。
在 ItemList 类中,我们添加了相同的 getItems 方法来返回项目列表。此方法确保我们可以轻松访问项目列表。
通过这些更改,JMS 序列化器可以准确地反序列化项目列表,并返回具有正确值的 Items 对象。
像这样:
class ItemList
{
#[Serializer\XmlList(entry: 'item', inline: true)]
#[Serializer\Type('array<App\Test\Item>')]
private array $items;
public function getItems(): array
{
return $this->items;
}
}
namespace App\Test;
use JMS\Serializer\Annotation as Serializer;
class Items {
#[Serializer\Type(ItemList::class)]
#[Serializer\SerializedName('items')]
private ItemList $items;
public function getItems(): array
{
return $this->items->getItems();
}
}