序列化器 - 规范化器的序列化器对象需要什么来将 json 反序列化为对象
Serializer - What does the serializer object needs of normalizers to deserialize json into object
我要转换这个json
[
{
"name": "1",
"created": "2019-12-08T15:43:00.000Z"
},
{
"name": "2",
"created": "2019-12-08T15:43:00.000Z"
}
]
到单个对象中。
class Persons
{
/**
* @var array<Person>
*/
public array $persons = [];
}
class Person
{
public string $name = '';
public DateTimeInterface $created;
}
我用它作为我的序列化程序
$encoder = [
new JsonEncoder(),
];
$normalizer = [
new DateTimeNormalizer(),
new ObjectNormalizer(),
];
$serializer = new Serializer($normalizer, $encoder);
当运行这个
$persons = $serializer->deserialize($json, Persons::class, 'json');
var_dump($persons);
$persons
是一个空数组
那么我需要哪些规范化程序才能工作?
是的,那是因为您需要将操作与 encoder/decoder 匹配 - JsonEncoder
用于 serialize
和 JsonDecoder
用于 deserialize
调用 :)
添加JsonDecoder
后,我相信它应该可以工作...
您的 json 不代表一个 Persons 对象,它是一个 Persons 数组。根据 https://symfony.com/doc/current/components/serializer.html#handling-arrays
您可以将 []
附加到您的 class 名称以反序列化对象数组:
$persons = $serializer->deserialize($json, Person::class.'[]', 'json');
那么,$persons
应该是一个 Person 对象数组。请注意 Person::class 是单数,不是复数。
要反序列化为 Persons::class - 如果您出于任何原因坚持 - 您的 json 要么必须嵌入到以下 json
{"persons": <here your json>}
或者您需要实现自己的序列化器(更具体地说,是您自己的非规范化器),并跳过一些步骤才能使用它。 (我不太确定,但我相信 php 中对象数组的预期文档表示法是 @var []Person
)
我要转换这个json
[
{
"name": "1",
"created": "2019-12-08T15:43:00.000Z"
},
{
"name": "2",
"created": "2019-12-08T15:43:00.000Z"
}
]
到单个对象中。
class Persons
{
/**
* @var array<Person>
*/
public array $persons = [];
}
class Person
{
public string $name = '';
public DateTimeInterface $created;
}
我用它作为我的序列化程序
$encoder = [
new JsonEncoder(),
];
$normalizer = [
new DateTimeNormalizer(),
new ObjectNormalizer(),
];
$serializer = new Serializer($normalizer, $encoder);
当运行这个
$persons = $serializer->deserialize($json, Persons::class, 'json');
var_dump($persons);
$persons
是一个空数组
那么我需要哪些规范化程序才能工作?
是的,那是因为您需要将操作与 encoder/decoder 匹配 - JsonEncoder
用于 serialize
和 JsonDecoder
用于 deserialize
调用 :)
添加JsonDecoder
后,我相信它应该可以工作...
您的 json 不代表一个 Persons 对象,它是一个 Persons 数组。根据 https://symfony.com/doc/current/components/serializer.html#handling-arrays
您可以将 []
附加到您的 class 名称以反序列化对象数组:
$persons = $serializer->deserialize($json, Person::class.'[]', 'json');
那么,$persons
应该是一个 Person 对象数组。请注意 Person::class 是单数,不是复数。
要反序列化为 Persons::class - 如果您出于任何原因坚持 - 您的 json 要么必须嵌入到以下 json
{"persons": <here your json>}
或者您需要实现自己的序列化器(更具体地说,是您自己的非规范化器),并跳过一些步骤才能使用它。 (我不太确定,但我相信 php 中对象数组的预期文档表示法是 @var []Person
)