Symfony - Deserialize json to an array of entities

后端 未结 5 1705
无人及你
无人及你 2020-12-28 08:38

I have a json object that I received by making a get API call. I make this call to receive a list of objects. It\'s a list of post... So I have an array of Post Objects.

相关标签:
5条回答
  • 2020-12-28 09:07

    The error is pretty clear. Your string does not match any existant class.

    The example in official documentation says:

    $person = $serializer->deserialize($data,'Acme\Person','xml');
    

    In your case it should be more like:

    $person = $serializer->deserialize($data['data'],'Moodress\Bundle\PosteBundle\Entity\Poste','json');
    

    Update:

    Ok then.

    First, your json file does not seem to be valid (use http://jsonlint.com/ to test it). Be careful of that.

    Second, you will have to fetch your json as an array with

    $data = json_decode($yourJsonFile, true);
    

    and then you can access to each 'data' array with

    foreach($data['data'] as $result)
    {
        /* Here you can hydrate your object manually like:
        $person = new Person();
        $person->setId($user['id']);
        $person->setDescription($user['description']);
    
        Or you can use a denormalizer. */
    }
    
    0 讨论(0)
  • 2020-12-28 09:10

    A less than ideal solution that I found was to first decode and then encode the json data again at the node that represents the data array. For example in your case:

    $json = json_decode($json);
    $json = json_encode($json->data);
    $serializer->deserialize($json, 'array<Moodress\Bundle\PosteBundle\Entity\Poste>', 'json');
    

    There must be a better solution than this but this seems more elegant than the above solution of de-serialising json.

    0 讨论(0)
  • 2020-12-28 09:11

    I would make something like this

    class PostsModel
    {
        /**
         * @var int
         */
        private $total;
    
        /**
         * @var PostModel[]
         */
        private $data;
    }
    
    class PostModel
    {
        /**
         * @var int
         */
        private $id;
    
        /**
         * @var UserModel
         */
        private $user;
    
        /**
         * @var string
         */
        private $description;
    
        /**
         * @var  int
         */
        private $nb_comments;
    
        /**
         * @var int
         */
        private $nb_likes;
    
        /**
         * @var \DateTime
         */
        private $date_creation;
    }
    
    class UserModel
    {
        /**
         * @var int
         */
        private $id;
    
        /**
         * @var string
         */
        private $username;
    }
    

    And in controller

                $posts = $this->serializer->deserialize($data, PostsModel::class, 'json');
    

    And this will return $postsModel with $data property which will have your array of entities

    0 讨论(0)
  • 2020-12-28 09:15

    Since Symfony Serializer Component 2.8 to deserialize array of objects:

    $persons = $serializer->deserialize($data, 'Acme\Person[]', 'json');
    

    https://symfony.com/doc/master/components/serializer.html#handling-arrays

    0 讨论(0)
  • 2020-12-28 09:18

    I think the best solution here is to create new PosteResponse class, like this one:

    namespace Moodress\Bundle\PosteBundle\Response;
    
    use JMS\Serializer\Annotation\Type;
    
    class PosteResponse
    {
        /**
         * @Type("integer")
         */
        private $total;
    
        /**
         * @Type("array<Moodress\Bundle\PosteBundle\Entity\Poste>")
         */
        private $data;
    
        //getters here
    }
    

    and deserialize your response to that class:

    $response = $serializer->deserialize(
        $json,
        'Moodress\Bundle\PosteBundle\Response\PosteResponse',
        'json'
    );
    $posts = $response->getData();
    

    That WILL do the trick, and it doesn't require you to decode and encode your json manually which is riddiculous in my opinion.

    0 讨论(0)
提交回复
热议问题