我想使用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);
}