【发布时间】:2021-09-21 23:14:45
【问题描述】:
我正在将 JSON 反序列化为一个 php 类(一个 Symfony 实体),它工作正常,但我的 JSON 中有一个嵌套属性,我不知道如何进入 php 类。
PHP 类:
class Vehicle
{
private $make:
/**
* @SerializedName("meta")
*/
private $colour;
// with getters and setters...
}
// These 2 lines let us use the @SerializedName annotation
$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
$objectNormalizer = new ObjectNormalizer($classMetadataFactory, $metadataAwareNameConverter);
$encoders = [new JsonEncoder()];
$normalizers = [$objectNormalizer];
$serializer = new Serializer($normalizers, $encoders);
$json = '
{
"make": "VW Golf",
"meta": {
"colour": "red"
}
}
';
$carJson = json_encode($json);
$vehicle = $serializer->deserialize(
$carJson,
Vehicle::class,
'json',
);
$vehicle->getMake(); // VW Golf
$vehicle->getColour(); // ['meta' => ['colour' => 'red']]
...但最后一行应该只返回red。
我希望我可以做类似@SerializedName("meta.colour") 或@SerializedName("[meta][colour]") 或@SerializedName("meta[colour]") 之类的事情,但这些都决定为空。
Symfony docs on serialization 看起来无法处理这种(简单)案例。
This Stackoverflow post 也处理嵌套属性,但在他们的示例中,嵌套属性必须反序列化到另一个 php 类,而不是映射到现有的 php 类,所以这对我没有帮助。
在反序列化 JSON 时,如何使 $colour 等于 red?
【问题讨论】:
-
自定义规范化器可能会对您有所帮助。 symfony.com/doc/current/serializer/custom_normalizer.html
-
正如之前的评论所说,您是否检查了一个自定义规范器,在您的情况下只有一个自定义反序列化函数?
-
谢谢 - 你说得对,自定义规范器是正确的方法。我发现 Symfony 文档中的示例在这方面没有帮助,我可能会打开 PR 将其添加到文档中。
标签: php json symfony serialization