Десериализация объекта json в сущность доктрины

нужна ваша помощь.

У меня есть объект JSON, который выглядит так:

{
"succes": true,
"count": 6,
"result": {
"main": [
{
"id": 21,
"name": "\u0421\u043f\u0443\u0442\u043d\u0438\u043a",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/21\/1340272755sputnik-.jpg",
"vote": "8,2",
"count_vote": "1479 \u0433\u043e\u043b\u043e\u0441\u043e\u0432",
"phone": "(044) 243-46-32; (044) 243-46-33 (\u0430\u0432\u0442\u043e\u043e\u0442\u0432.)",
"address": "\u0433. \u041a\u0438\u0435\u0432, \u0443\u043b. \u0418\u0441\u043a\u0440\u043e\u0432\u0441\u043a\u0430\u044f, 18"},
{
"id": 126,
"name": "\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441 \u0432 \u0422\u0420\u0426 \"Sky Mall\"",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/126\/1429607129megapleks.png",
"vote": "7,4",
"count_vote": "829 \u0433\u043e\u043b\u043e\u0441\u043e\u0432",
"phone": "(096)129 48 54, (044) 290 83 75",
"address": "\u0433. \u041a\u0438\u0435\u0432, \u043f\u0440-\u0442 \u0413\u0435\u043d\u0435\u0440\u0430\u043b\u0430 \u0412\u0430\u0442\u0443\u0442\u0438\u043d\u0430, 2-\u0422"},
{
"id": 108,
"name": "\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441 \u0432 \u0422\u0420\u0426 \"\u041a\u043e\u043c\u043e\u0434\"",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/108\/1429607154multipleks-v-komode.png",
"vote": "7,1",
"count_vote": "409 \u0433\u043e\u043b\u043e\u0441\u043e\u0432",
"phone": "(044)-593-35-77, 593-35-80",
"address": "\u0433. \u041a\u0438\u0435\u0432, \u0443\u043b. \u041b\u0443\u043d\u0430\u0447\u0430\u0440\u0441\u043a\u043e\u0433\u043e 4, 4-\u044d\u0442\u0430\u0436"}
],
"unmain": [
{
"id": 14,
"name": "\u041b\u0435\u0439\u043f\u0446\u0438\u0433",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/14\/1332685506lejpcig.png",
"vote": "8,0",
"count_vote": "3402 \u0433\u043e\u043b\u043e\u0441\u0430",
"phone": "407-19-93, 403-86-59, 403-86-60",
"address": "\u0433. \u041a\u0438\u0435\u0432, \u043f\u0440\u043e\u0441\u043f. \u041b\u0435\u0441\u044f \u041a\u0443\u0440\u0431\u0430\u0441\u0430, 8"},
{
"id": 13,
"name": "\u0424\u043b\u043e\u0440\u0435\u043d\u0446\u0438\u044f",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/13\/1332686274florencija.png",
"vote": "8,0",
"count_vote": "2134 \u0433\u043e\u043b\u043e\u0441\u0430",
"phone": "(044) 515 87 81",
"address": "\u0433.\u041a\u0438\u0435\u0432, \u043f\u0440\u043e\u0441\u043f. \u041c\u0430\u044f\u043a\u043e\u0432\u0441\u043a\u043e\u0433\u043e, 31"},
{
"id": 134,
"name": "\u0411\u0430\u0442\u0442\u0435\u0440\u0444\u043b\u044f\u0439 \u041a\u043e\u0441\u043c\u043e\u043f\u043e\u043b\u0438\u0442",
"url": "\/cinema\",
"image": "\/upload\/kinoteatrs\/134\/1332684447bolshevik.jpg",
"vote": "7,6",
"count_vote": "1512 \u0433\u043e\u043b\u043e\u0441\u043e\u0432",
"phone": "200-90-18, 200-90-20; 200-90-10, 200-90-12 (\u0430\u0432\u0442\u043e\u043e\u0442\u0432.)",
"address": "\u0433. \u041a\u0438\u0435\u0432, \u0443\u043b. \u0413\u0435\u0442\u044c\u043c\u0430\u043d\u0430, 6"}
]
}
}

И у меня есть сущность

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
*
* @ORM\Entity
* @ORM\Table(name="cinemas")
*/
class Cinemas
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\Column(type="string", length=100)
*/
private $phone;
/**
* @ORM\Column(type="string", length=100)
*/
private $address;
/**
* @ORM\Column(type="string", length=100)
*/
private $url;
/**
* @ORM\Column(type="string", length=100)
*/
private $image;
/**
* @ORM\Column(type="string", length=100)
*/
private $vote;
/**
* @ORM\Column(type="string", length=100)
*/
private $countVote;/**
* @return mixed
*/
public function getId()
{
return $this->id;
}

/**
* @return mixed
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}

/**
* @return mixed
*/
public function getPhone()
{
return $this->phone;
}

/**
* @param mixed $phone
*/
public function setPhone($phone)
{
$this->phone = $phone;
}

/**
* @return mixed
*/
public function getAddress()
{
return $this->address;
}

/**
* @param mixed $address
*/
public function setAddress($address)
{
$this->address = $address;
}

/**
* @return mixed
*/
public function getUrl()
{
return $this->url;
}

/**
* @param mixed $url
*/
public function setUrl($url)
{
$this->url = $url;
}

/**
* @return mixed
*/
public function getImage()
{
return $this->image;
}

/**
* @param mixed $image
*/
public function setImage($image)
{
$this->image = $image;
}

/**
* @return mixed
*/
public function getVote()
{
return $this->vote;
}

/**
* @param mixed $vote
*/
public function setVote($vote)
{
$this->vote = $vote;
}

/**
* @return mixed
*/
public function getCountVote()
{
return $this->countVote;
}

/**
* @param mixed $countVote
*/
public function setCountVote($countVote)
{
$this->countVote = $countVote;
}}

Задача состоит в следующем: каков наилучший способ десериализации этого json и сохранения всех объектов внутри main и unmain в базе данных.
Нужна лучшая практика, спасибо!

Обновить: Ну, на самом деле, я думаю, что неправильно описываю свое предложение … Я знаю, как получить экземпляр класса std из этого json. Например, у нас есть:

[0] => stdClass Object
(
[id] => 21
[name] => text
[url] => /cinema/sputnik-
[image] => /upload/kinoteatrs/21/1340272755sputnik-.jpg
[vote] => 8,2
[count_vote] => 1479 votes
[phone] => (014) 223-46-32; (054) 245-46-33
[address] => address
)

Задача состоит в том, как этот стандартный класс преобразовать в объект Cinema.

Я думаю, что это должно быть сделано с $serializer->deserialize();

Да, я могу снова закодировать эти объекты в JSON, а затем сделать как

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

или мы можем установить каждое свойство через цикл

Но это не похоже на решение ..

-3

Решение

Добавьте статический метод к вашей сущности:

static public function fromJson($data){
$s = new self();
$s->setId($data['id'];
//do the same for every other fields

return $s
}

Затем переберите JSON и используйте только что созданный метод:

$d = json_decode($json);
foreach($d['result']['main'] as $item){
$c = Cinema::fromJson($item);
}

Вам нужно будет внести некоторые изменения, чтобы сделать то, что вы собираетесь делать.

1

Другие решения

Ну, я нахожу решение.
Предполагая, что у нас есть

$cinemas => stdClass Object
(
[id] => 21
[name] => text
[url] => /cinema/sputnik-
[image] => /upload/kinoteatrs/21/1340272755sputnik-.jpg
[vote] => 8,2
[count_vote] => 1479 votes
[phone] => (014) 223-46-32; (054) 245-46-33
[address] => address
)

Преобразовать его в сущность с помощью:

        $normalizers = array(new ObjectNormalizer());

$serializer = new Serializer($normalizers);
$serializer->denormalize($cinemas, 'AppBundle\Entity\Cinemas');

Мы получаем объект как это:

        [0] => AppBundle\Entity\Cinemas Object
(
[id:AppBundle\Entity\Cinemas:private] =>
[name:AppBundle\Entity\Cinemas:private] => text
[phone:AppBundle\Entity\Cinemas:private] => (014) 223-46-32; (054) 245-46-33
[address:AppBundle\Entity\Cinemas:private] => text
[url:AppBundle\Entity\Cinemas:private] => /cinema/sputnik-
[image:AppBundle\Entity\Cinemas:private] => /upload/kinoteatrs/21/1340272755sputnik-.jpg
[vote:AppBundle\Entity\Cinemas:private] => 8,2
[countVote:AppBundle\Entity\Cinemas:private] => 1479 votes
)

И тогда мы сможем сохранить это с менеджером Doctrine. Надеюсь, это сэкономило время для кого-то.

0

По вопросам рекламы [email protected]