2016-08-15 3 views
-3

Вам нужна ваша помощь.Deserialise json object to doctrine entity

У меня есть объект 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; 
    } 


} 

квестинг: Что это лучший способ deserialise это JSON и сохраняются все объекты внутри основной и не использовать базу данных. Нужна лучшая практика, спасибо!

Обновление: Ну, на самом деле, я думаю, что я неправильно описываю свое предложение. Я знаю, как получить экземпляр класса 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 
      ) 

Квест, как этот класс std преобразуется в объект Cinema.

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

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

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

или мы можем установить все свойства с помощью петли

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

+0

Лучшая практика: всегда начинать с [Чтение руководства в этом случае 'json_decode()'] (http://php.net/manual/en/function.json-decode.php) – RiggsFolly

+0

Картина стены кода и просьбы ** Best Practice ** не скрывает тот факт, что вы не предприняли никаких явных усилий для решения своей проблемы. – RiggsFolly

+0

@RiggsFolly Okey, теперь я об этом, но о том, как декодировать, начиная с основного и неиндексированного раздела. Потому что мне нужны объекты внутри, чтобы перенести их непосредственно в Doctrine Manager. Что вы & – Saba

ответ

1

Добавить статический метод для вашей организации:

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); 
} 

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

0

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

$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 
      ) 

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