解串器仅适用于附加标签

问题描述 投票:0回答:1

我想将 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

php jmsserializerbundle jms-serializer
1个回答
0
投票

我在 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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.