簡體   English   中英

如何在 Symfony Serializer 中反序列化一組對象?

[英]How can I deserialize an array of objects in Symfony Serializer?

Symfony Serializer是否可以反Symfony Serializer屬性中的對象數組? 我有一個帶有$Npc = []屬性的Boss類,它需要保存一個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[] 類型,給定數組”。

這是因為我忘記將ArrayDenormalizer添加到序列化器的規范化池中。 添加后,一切正常。

希望這對某人有幫助。

以下(完整)示例適用於 Symfony 5.3 組件。 它結合了上述一些內容並添加了一些更必要的部分:

Serializer 需要包括ArrayDenormalizerObjectNormalizer ObjectNormalizer需要適當的配置。 完整的創作可能如下所示:

return new Serializer(
    [
        new ArrayDenormalizer(),
        new DateTimeNormalizer(),
        new ObjectNormalizer(
            null,
            null,
            null,
            new ReflectionExtractor()
        ),
    ],
    [
        new JsonEncoder(),
    ]
);

似乎順序對於規范化器/去規范化器很重要,可能是由於優先級。 ObjectNormalizer之后放置DateTimeNormalizer將不起作用。

目標類需要提供三個方法以允許映射其他類的數組:

class Place
{
    /**
     * @var OpeningHour[]
     */
    protected $openingHours = [];

    /**
     * @return OpeningHour[]
     */
    public function getOpeningHoursSpecification(): array
    {
        return $this->openingHours;
    }

    public function addOpeningHoursSpecification(OpeningHour $openingHour): void
    {
        $this->openingHours[] = $openingHour;
    }

    public function removeOpeningHoursSpecification(OpeningHour $openingHour): void
    {
    }
}

所有三種方法都需要存在。 第一個是為了允許 Serializer 獲取現有值並允許比較。 另外兩個需要存在,以便通過添加缺失的和刪除不再存在的實體來調整現有值以匹配預期值。

以上不提供刪除的實現,因為這是從單向項目中獲取的。

是的,您可以反序列化數組,但您需要在第二個參數上提供對象以及它實際上是數組的信息。 你可以這樣做:

use Symfony\Component\Serializer\Serializer;

class Boss {

    private $Npc = [];    

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

    }
}

您可以在處理數組的文檔中找到有關此的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM