如何用关系反序列化

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

我正在使用 Symfony 序列化器对 JSON 数据进行非规范化并创建具有关系的实体。

我的 json 正文如下所示:

{
    "user": "1",
    "prop1": "string"
}

这是我的实体:

<?php

namespace App\Entity;

use App\Repository\ClassARepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

#[ORM\Entity(repositoryClass: ClassARepository::class)]
class ClassA
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne]
    #[ORM\JoinColumn(nullable: false)]
    #[Groups(['default'])]
    private ?User $user = null;

    #[ORM\Column(length: 255, nullable: true)]
    #[Groups(['default'])]
    private ?string $prop1 = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): static
    {
        $this->user = $user;

        return $this;
    }

    public function getProp1(): ?string
    {
        return $this->prop1;
    }

    public function setProp1(?string $prop1): static
    {
        $this->prop1 = $prop1;

        return $this;
    }
}

这是我在控制器中设置序列化器的代码:

$defaultContext = [AbstractNormalizer::GROUPS => ['default']];
        $classMetadataFactory = new ClassMetadataFactory(new AttributeLoader());
        $encoder = new JsonEncoder();

        $normalizer = new ObjectNormalizer($classMetadataFactory, null, null, null, null, null, $defaultContext);
        $serializer = new Serializer([$normalizer], [$encoder]);

现在执行对 api 端点的请求时,我遇到了错误:

Failed to denormalize attribute \"user\" value for class \"App\\Entity\\ClassA\": Expected argument of type \"?App\\Entity\\User\", \"string\" given at property path \"user\".

如何处理 json 中的用户 id 字符串以转换为特定的用户实体?

我尝试在 ObjectNormalizer 中使用 ReflectionExtractor,但我的响应如下所示:

App\Entity\ClassA {#751
  -id: null
  -user: 
App\Entity
\
User {#808
    -id: null
    -email: null
    -roles: []
    -password: null
  }
  -prop1: "string"
}
php deserialization symfony7
1个回答
0
投票

反序列化具有关系的数据通常涉及将序列化数据(例如 JSON 或 XML)转换回结构化对象,同时维护这些对象之间的关系。这是使用关系进行反序列化的一般方法:

1.了解您的数据结构

在反序列化之前,请熟悉序列化数据的结构以及如何定义关系。例如:

  • 一对多:单亲可以有多个孩子。
  • 多对多:多个父母可以与多个孩子建立联系。

2.选择序列化格式

常见格式包括:

  • JSON:常用于 Web 应用程序。
  • XML:用于各种数据交换场景。
  • 协议缓冲区:一种语言中立的二进制格式。

3.使用正确的库/工具

根据您使用的语言,选择适当的库:

  • Python
    json
    marshmallow
    pydantic
  • Java:Jackson 或 Gson 用于 JSON,JAXB 用于 XML。
  • JavaScript:内置
    JSON.parse()
    或类似
    axios
    的库,用于获取和反序列化数据。

4.反序列化数据

这是一个使用 Python 和 JSON 的基本示例:

import json

# Example JSON data with relationships
data = '''
{
    "authors": [
        {"id": 1, "name": "Author A"},
        {"id": 2, "name": "Author B"}
    ],
    "books": [
        {"id": 101, "title": "Book 1", "author_id": 1},
        {"id": 102, "title": "Book 2", "author_id": 2},
        {"id": 103, "title": "Book 3", "author_id": 1}
    ]
}
'''

# Deserialize JSON
parsed_data = json.loads(data)

# Build relationships
authors = {author['id']: author for author in parsed_data['authors']}
books = parsed_data['books']

# Attach authors to books
for book in books:
    book['author'] = authors[book['author_id']]

print(books)

5.维持关系

反序列化时:

  • 创建映射(如字典)来跟踪关系。
  • 确保反序列化后相关对象是链接的。

6.处理复杂的关系

对于更复杂的关系(例如嵌套结构),您可能需要递归反序列化并构建对象图。

7.错误处理

实施错误处理来管理数据丢失或无效关系等问题。

结论

使用关系进行反序列化涉及相关数据的仔细映射和链接。了解您的数据结构并使用正确的工具将使过程更加顺利。

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