2013-05-23 35 views
8

Symfony ve FOSRestBundle ile RESTful bir uygulama yapıyorum. FOSRestBundle, verileri json biçimine serileştirmek için JMS Seriazlizer'ı kullanır. Her şeyle ilgili küçük bir sorunum var. JMS Serializer bir özelliği göstermiyor

Bu

benim varlık sınıfı

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

olduğunu ve bana böyle json geçerli:

benim varlık $ uuid olarak
{ 
      "id": 5, 
      "content": "zxcvzxcvzxc", 
      "lat": 37.422005, 
      "lon": -122.084095, 
      "date": "2013-05-20T05:06:57+0100", 
      "status": 0, 
      "points": 0, 
      "owner": 0 
     } 

@Exclude ek açıklama haveing ​​sadece özelliktir ve beklendiği gibi orada değil ama $ sign özelliği de eksik. Gördüğünüz gibi, $ işaretine @Expose ek açıklaması koydum ama hiçbir şey değiştirmedim. Ben ("tüm") @ExclusionPolicy kullanarak ve tüm uuid hariç maruz çalıştı ama yine de biraz php bug

bir fikrin yanlış nedir

ve nasıl düzeltmek için olduğu gibi bazı bilgiler buldum

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

alıyorum o?

+1

i yerine nedeniyle ek açıklamaları kullanmanın ayrı dosyaları (xml/yml) da seri hale ve doktrin eşlemeleri yapılandırma tavsiye ederim o daha kolay uzatma ve paket kalıtım sağlar ama onun kişisel tercih meselesi ... sadece benim birkaç sent – nifr

+0

Teşekkürler, ben düşüneceğim. Symfony, konfigürasyon ve materyal yazmak için birkaç format sunuyor ama iki ucu keskin kılıç. – Gustek

cevap

9

Boş değerleri boş dizeler olarak serileştirebilirsiniz. ayarlarda

fos_rest: 
    view: 
     serialize_null: true 
+0

config içinde serialize_null ayarladık ama hiç bir etkisi olmadı. – Gustek

+0

Kullandığınız jms/serializer paketinin hangi sürümü var? –

+0

İlk örnekte olduğu gibi saf serializer ile varlık serileştirmeye çalışın. Şu anda güncellenmiş bir besteci güncellemem var. Eğer ilk örneğinizde olduğu gibi doğrudan serilizer kullanırsam, boş bir dize olarak tercih ettiğim gibi boş bir değer verir. Yardımın için teşekkürler, müşteriye şimdi olduğu gibi kabul ettim ve buna devam ediyorum. – Gustek

7

forgottenbas FOSRestBundle için 'es çözüm içinden tanımlayabilirsiniz o FOSRestBundle için size biraz

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

yardımcı Tahmin benim için çalışmadı. Ben senin yapılandırmasında burada çözüm https://github.com/FriendsOfSymfony/FOSRestBundle/pull/480

Kullanım serializer bölümü değil view bulduk:

fos_rest: 
    serializer: 
     serialize_null: true 
+0

Teşekkür ederim, muhtemelen bana hata ayıklama saatlerini kurtardı! :-) –