我正在使用 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"
}
反序列化具有关系的数据通常涉及将序列化数据(例如 JSON 或 XML)转换回结构化对象,同时维护这些对象之间的关系。这是使用关系进行反序列化的一般方法:
在反序列化之前,请熟悉序列化数据的结构以及如何定义关系。例如:
常见格式包括:
根据您使用的语言,选择适当的库:
json
、marshmallow
或pydantic
。JSON.parse()
或类似 axios
的库,用于获取和反序列化数据。这是一个使用 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)
反序列化时:
对于更复杂的关系(例如嵌套结构),您可能需要递归反序列化并构建对象图。
实施错误处理来管理数据丢失或无效关系等问题。
使用关系进行反序列化涉及相关数据的仔细映射和链接。了解您的数据结构并使用正确的工具将使过程更加顺利。