我想将JSON反序列化为具有实体关系的对象。
传入JSON数据
{
"name": "john",
"books": [
{
"title": "My life"
}
]
}
json反序列化的结果,如
$object = $this->get('serializer')->deserialize($jsonData, 'Author', 'json');
是
Author { #name: 'john' #books: array:1 [ 0 => array:1 [ "title" => "My life" ] ] }
我想反序列化为像这样的对象
Author { #name: 'john' #books: array:1 [ Book { "title" => "My life" } ] }
我理解为什么反序列化不能反序列化Book。有了JMSSerializerBundle,Type注释就可以解决这种情况。
有可能使用Symfony Serializer组件吗?或者我必须使用JMSSerializer吗?
谢谢你的帮助;)
我的对象
class Author
{
private $name;
private $books;
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getBooks()
{
return $this->books;
}
/**
* @param mixed $books
*/
public function setBooks(array $books)
{
$this->books = $books;
}
}
class Book
{
private $title;
private $author;
/**
* @return mixed
*/
public function getTitle()
{
return $this->title;
}
/**
* @param mixed $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return mixed
*/
public function getAuthor()
{
return $this->author;
}
/**
* @param mixed $author
*/
public function setAuthor(Author $author)
{
$this->author = $author;
}
}
Guilhem是对的,默认的Symfony ObjectNormalizer
目前无法规范化非标量类型的属性。
但是,Symfony 3.1中添加了此功能:https://github.com/symfony/symfony/pull/17660
同时,您可以在您的项目中复制/粘贴上面链接的PR中提供的ObjectNormalizer
版本。
您还可以查看API平台中提供的类似实现:
- https://github.com/api-platform/core/blob/master/src/Bridge/Symfony/PropertyInfo/Metadata/Property/PropertyInfoPropertyMetadataFactory.php#L48-L51
- https://github.com/api-platform/core/blob/master/src/JsonLd/Serializer/ItemNormalizer.php#L155-L178
符号序列化程序无法对复杂属性进行反规范化。
我认为唯一的方法是自己管理对象的非规范化:
use SymfonyComponentSerializerNormalizerDenormalizableInterface;
use SymfonyComponentSerializerNormalizerDenormalizerInterface;
class Author implements DenormalizableInterface {
public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) {
if (isset($data['name'])) {
$this->setName($data['name']);
}
if (isset($data['books']) && is_array($data['books'])) {
$books = array();
foreach ($data['books'] as $book) {
$books[] = $denormalizer->denormalize($book, Book::class, $format, $context);
}
$this->setBooks($books);
}
}
// ...
}
你也可以创建一个自定义规范化器,但这更复杂(你可以看看这篇文章,它或多或少地解释了如何做到这一点)。
我希望这将帮助你:-)