2013-05-23 20 views
8

Wykonuję aplikację RESTful z Symfony i FOSRestBundle. FOSRestBundle używa JMS Seriazlizer do serializowania danych do formatu json. Mam wszystko, co pracuję z jednym małym problemem.Serializator JMS nie ujawnia żadnej właściwości

To moja klasa Entity

/** 
* 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 

a to json uzyskać:

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

W moim podmiot $ UUID to jedyna nieruchomość haveing ​​@Exclude adnotacji i nie ma co oczekiwać, ale nie ma również właściwości znaku $. Jak widzisz, wstawiam adnotację @Expose do znaku $, ale nic nie zmieniłem. Próbowałem za pomocą @ExclusionPolicy („wszystko”) i odsłonić wszystko z wyjątkiem UUID ale jestem coraz

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

znalazłem pewne informacje, jak to niektórzy php bug

jakiś pomysł co jest nie tak i jak to naprawić to?

+1

polecam Ci konfigurowania serializacji i doktryny mapowania w oddzielne pliki (XML/yml) zamiast korzystania z adnotacji, ponieważ pozwala na łatwiejsze rozszerzanie i wiązanie dziedziczenia, ale jest to kwestia osobistych preferencji ... tylko moje kilka centów. – nifr

+0

Dzięki, rozważę. To naprawdę miłe Symfony oferuje kilka formatów do pisania konfiguracji i innych rzeczy, ale jest to miecz obosieczny. – Gustek

Odpowiedz

9

Można serializować wartości null jako puste ciągi. Przypuszczenie to pomóc trochę

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

Dla FOSRestBundle można określić w ustawieniach

fos_rest: 
    view: 
     serialize_null: true 
+0

Ustawiłem serialize_null w config, ale nie miałem żadnego efektu. – Gustek

+0

jakiej wersji pakietu jms/serializer używasz? Spróbuj serializować encję za pomocą czystego serializera, tak jak w pierwszym przykładzie. –

+0

Mam dev-master w composer, ale teraz nic się nie zmieniło. Jeśli użyję programu do seralizacji bezpośrednio w Twoim pierwszym przykładzie, to działa, ale daje wartość null jako wartość, a nie puste łańcuchy, jak wolałbym. Dzięki za pomoc, zrobiłem to, aby zaakceptować klienta tak, jak jest teraz i kontynuować to. – Gustek

7

forgottenbas „es rozwiązanie dla FOSRestBundle nie działa dla mnie. Znalazłem rozwiązanie tutaj https://github.com/FriendsOfSymfony/FOSRestBundle/pull/480

Zastosowanie serializer rozdział w swojej konfiguracji, nie view:

fos_rest: 
    serializer: 
     serialize_null: true 
+0

Dziękuję, prawdopodobnie zaoszczędziło mi godzin debugowania! :-) –