Symfony JMS序列化程序如何手动处理序列化?
我希望使用JMSSerializarBundle手动序列化JSON。我和HandlerCallback有些麻烦。下面是一个代码:Symfony JMS序列化程序如何手动处理序列化?,symfony,jms,jmsserializerbundle,Symfony,Jms,Jmsserializerbundle,我希望使用JMSSerializarBundle手动序列化JSON。我和HandlerCallback有些麻烦。下面是一个代码: namespace Company\Bundle\Model; use JMS\Serializer\Annotation\Type; use JMS\Serializer\Annotation\SerializedName; use JMS\Serializer\Annotation\HandlerCallback; use JMS\Serializer\Json
namespace Company\Bundle\Model;
use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\HandlerCallback;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\DeserializationContext;
use JMS\Serializer\TypeParser;
use JMS\Serializer\Serializer;
class Blog
{
protected $blogName;
protected $blogUrl;
protected $blogCategory;
/**
* @Type("array<Company\Bundle\Model\Post>")
* @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 = ????;
}
}
namespace Company\Bundle\Model;
使用JMS\Serializer\Annotation\Type;
使用JMS\Serializer\Annotation\SerializedName;
使用JMS\Serializer\Annotation\HandlerCallback;
使用JMS\Serializer\JsonDeserializationVisitor;
使用JMS\Serializer\DeserializationContext;
使用JMS\Serializer\TypeParser;
使用JMS\Serializer\Serializer;
班级博客
{
受保护的$blogName;
受保护的$blogUrl;
受保护类别;
/**
*@Type(“数组”)
*@SerializedName(“数据”)
*/
受保护的员额;
/**
*@param混合$posts
*/
公共职能设置员额(员额)
{
$this->posts=$posts;
}
/**
*@返回混合
*/
公共函数getPosts()
{
返回$this->posts;
}
/**
*@HandlerCallback(“json”,direction=“反序列化”)
*/
公共函数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);
}
我尝试过,但这将创建新的空对象$this->addPost(newpost($Post_data));这$This->addPost(Post::反序列化fromJSON($Post_data));不正确,因为没有这样的静态方法。实际上,您需要编写自己的
Post::deserializeFromJson
method:)在这种情况下,如果我应该编写自己的deserializeFromJson方法,那么使用JMS/serializer有什么好处:)唯一的官方示例/文档如下: