如何在Symfony Serializer中反序列化对象数组?

问题描述 投票:8回答:3

Symfony Serializer中是否可以反序列化属性中的对象数组?我有一个Boss类与$Npc = []属性需要持有一组Npc对象。我确实在文档中看到了一些示例,但他们没有说明此功能。我有一个带有NPC数组的json字符串例如:

class Boss {

    private $Npc = [];    

    /**
    * @return Npc[]
    */
    public function getNpcs(): array
    {
        return $this->npcs;
    }
}

我使用的是php7.1和symfony / serializer版本^ 3.3。

编辑:我已经尝试过PhpDocExtractor,但它不会让我安装它。 :(

编辑:这是一个可能的JSON值:

{
    "bossname": "Epic boss!",
    "npcs": [{
        "id": 24723,
        "name": "Selin Fireheart",
        "urlSlug": "selin-fireheart",
        "creatureDisplayId": 22642
    }]
}
php symfony serializer
3个回答
6
投票

我找到了一种方法来做到这一点:)。我通过Composer安装了Symfony PropertyAccess包。使用此包,您可以添加加法器,删除器和缓冲器。这样,Symfony Serializer将使用正确的对象自动填充数组。例:

private $npcs = [];

public function addNpc(Npc $npc): void
{
    $this->npcs[] = $npc;
}

public function hasNpcs(): bool
{
    return count($this->npcs) > 0
}

等等

这样您就可以使用ObjectNormalizer:

$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());

编辑:至少从v3.4开始,你还必须创建一个移除方法。否则它将无法工作(没有错误或警告)。


1
投票

在没有得到结果的情况下,我已经挣扎了这么多个小时。每次我添加一个加法器函数时,objectnormalizer都想调用这个函数,但得到的错误类似于“字段xyz应该是xyz []类型,给定的数组”。

这是因为我忘了将arraynormalizer添加到序列化器的规范化器池中。添加后,一切正常。

希望这对某人有帮助。


-1
投票

是的,您可以反序列化数组,但是您需要在第二个参数上提供对象以及它实际上是数组的信息。你可以这样做:

use Symfony\Component\Serializer\Serializer;

class Boss {

    private $Npc = [];    

    /**
    * @return Npc[]
    */
    public function getNpcs(): array
    {
        return $serializer->deserialize($this->npcs, 'Acme\Npc[]', 'json');

    }
}

您可以在handling arrays的文档中找到有关此内容的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.