JMS序列化程序如何手动处理序列化



我想使用JMSSerializerBundle手动取消序列化JSON。我在HandlerCallback上遇到了一些麻烦。这是一个代码:

namespace CompanyBundleModel;
use JMSSerializerAnnotationType;
use JMSSerializerAnnotationSerializedName;
use JMSSerializerAnnotationHandlerCallback;
use JMSSerializerJsonDeserializationVisitor;
use JMSSerializerDeserializationContext;
use JMSSerializerTypeParser;
use JMSSerializerSerializer;
class Blog
{
    protected $blogName;
    protected $blogUrl;
    protected $blogCategory;
    /**
     * @Type("array<CompanyBundleModelPost>")
     * @SerializedName("data")
     */
    protected $posts;
    /**
     * @param mixed $posts
     */
    public function setPosts($posts)
    {
        $this->posts = $posts;
    }
    /**
     * @return mixed
     */
    public function getPosts()
    {
        return $this->posts;
    }
    /**
     * @HandlerCallback("json",  direction = "deserialization")
     */
    public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context)
    {
        $this->blogName = $data['data'][0]['blogName'];
        $this->blogUrl =  $data['data'][0]['blogUrl'];
        $this->blogCategory = $data['data'][0]['blogCategory'];
        $this->posts = ????;
    }
}

我应该添加什么而不是????获取对象Company\Bundle\Model\Post 的数组

也许有这样的事情:

/**
 * @HandlerCallback("json",  direction = "deserialization")
 */
public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context)
{
    $this->blogName = $data['data'][0]['blogName'];
    $this->blogUrl =  $data['data'][0]['blogUrl'];
    $this->blogCategory = $data['data'][0]['blogCategory'];
    $this->posts = new ArrayCollection();
    for ( $data['data'][0]['posts'] as $post_data ){
        $this->posts->add(new Post($post_data));
        // OR
        $this->posts->add(Post::deserializeFromJson($post_data));
    }
}

您实际上可以重用其他对象和本地注释。

/**
 * @HandlerCallback("json",  direction = "deserialization")
 */
public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context)
{
    $typeParser = new TypeParser();
    /** @var ClassMetadata $metadata */
    $metadata = $context->getMetadataFactory()->getMetadataForClass(self::class);
    $visitor->startVisitingObject($metadata, $this, $typeParser->parse(self::class), $context);
    $visitor->visitProperty($metadata->propertyMetadata['blogName'], $data['data'][0], $context);
    $visitor->visitProperty($metadata->propertyMetadata['blogUrl'], $data['data'][0], $context);
    $visitor->visitProperty($metadata->propertyMetadata['blogCategory'], $data['data'][0], $context);
    $visitor->visitProperty($metadata->propertyMetadata['posts'], $data['data'][0], $context);
}