在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
}]
}
我找到了一种方法来做到这一点:)。我通过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开始,你还必须创建一个移除方法。否则它将无法工作(没有错误或警告)。
在没有得到结果的情况下,我已经挣扎了这么多个小时。每次我添加一个加法器函数时,objectnormalizer都想调用这个函数,但得到的错误类似于“字段xyz应该是xyz []类型,给定的数组”。
这是因为我忘了将arraynormalizer添加到序列化器的规范化器池中。添加后,一切正常。
希望这对某人有帮助。
是的,您可以反序列化数组,但是您需要在第二个参数上提供对象以及它实际上是数组的信息。你可以这样做:
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的文档中找到有关此内容的更多信息