2013-05-23 15 views
8

Realizzo un'app RESTful con Symfony e FOSRestBundle. FOSRestBundle utilizza JMS Seriazlizer per serializzare i dati in formato json. Ho tutto ciò che funziona con un piccolo problema.Il serializzatore JMS non espone una proprietà

Questa è la mia classe di entità

/** 
* Post 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="Tomalo\AdminBundle\Entity\PostRepository") 
* @ExclusionPolicy("none") 
*/ 
class Post 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="content", type="text") 
    * @Assert\NotBlank() 
    */ 
    private $content; 

    /** 
    * @var float 
    * 
    * @ORM\Column(name="lat", type="float") 
    * @Assert\NotBlank() 
    */ 
    private $lat; 

    /** 
    * @var float 
    * 
    * @ORM\Column(name="lon", type="float") 
    * @Assert\NotBlank() 
    */ 
    private $lon; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date", type="datetime") 
    */ 
    private $date; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="sign", type="string", length=50, nullable=true) 
    * @Expose 
    */ 
    private $sign; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="status", type="integer") 
    */ 
    private $status=0; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="points", type="integer") 
    */ 
    private $points=0; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="uuid", type="string", length=43) 
    * @Assert\NotBlank() 
    * @Exclude 
    */ 
    private $uuid; 


    private $owner; 


    //get/set method continue 

e questo è JSON ottengo:

{ 
      "id": 5, 
      "content": "zxcvzxcvzxc", 
      "lat": 37.422005, 
      "lon": -122.084095, 
      "date": "2013-05-20T05:06:57+0100", 
      "status": 0, 
      "points": 0, 
      "owner": 0 
     } 

Nella mia entità $ UUID è l'unica proprietà haveing ​​annotazioni @Exclude e non c'è come previsto, ma manca anche la proprietà $ sign. Come vedi, ho inserito l'annotazione @Expose in $ sign, ma non ho cambiato nulla. Ho provato ad utilizzare @ExclusionPolicy ("tutto") ed esporre tutti tranne per uuid ma sto ottenendo

Warning: json_encode(): recursion detected in E:\workspace\htdocs\tomalo\vendor\jms\serializer\src\JMS\Serializer\JsonSerializationVisitor.php line 29 

ho trovato alcune informazioni come lo è un po 'php bug

alcuna idea di ciò che è sbagliato e come rimediare vero?

+1

vi consiglio di configurazione delle serializzazione e la dottrina mapping in file separati (xml/YML) invece di utilizzare le annotazioni perché consente un'estensione più facile e l'ereditarietà in bundle ma è una questione di preferenze personali ... solo i miei pochi centesimi – nifr

+0

Grazie, prenderò in considerazione. È davvero bello Symfony offre pochi formati per scrivere la configurazione e cose ma è un'arma a doppio taglio. – Gustek

risposta

9

È possibile serializzare valori null come stringhe vuote. Immagino che si aiuta un po '

$context = new SerializationContext(); 
$context->setSerializeNull(true); 
$objectData = $serializer->serialize($object, 'json', $context); 

Per FOSRestBundle è possibile definire nelle impostazioni

fos_rest: 
    view: 
     serialize_null: true 
+0

Ho impostato serialize_null in config ma non ha avuto effetto. – Gustek

+0

quale versione di jms/serializer-bundle stai usando? Prova a serializzare entità con serializzatore puro come nel primo esempio –

+0

Ho dev-master in compositore aggiornato solo ora nulla è cambiato. Se uso il serilizer direttamente come nel tuo primo esempio funziona, anche se dà null come valore non stringhe vuote come preferirei. Grazie per l'aiuto, l'ho fatto accettare in client come è adesso e continuare con questo. – Gustek

7

forgottenbas soluzione 'es per FOSRestBundle non ha funzionato per me. Ho trovato una soluzione qui sezione https://github.com/FriendsOfSymfony/FOSRestBundle/pull/480

Uso serializer nella vostra configurazione, non view:

fos_rest: 
    serializer: 
     serialize_null: true 
+0

Grazie, probabilmente mi hai risparmiato ore di debugging! :-) –

Problemi correlati