2015-07-23 25 views
6

Stiamo utilizzando Symfony2 FOSRestBundle con JMSSerializerBundle per lo sviluppo di API REST da utilizzare dagli sviluppatori mobili.JMSSerializerBundle Mostra valore vuoto invece di valore nullo

La risposta dell'API nel formato JSON restituisce "null" come valore delle proprietà laddove applicabile, che genera un'eccezione per la libreria di terze parti utilizzata dagli sviluppatori mobili.

Non vedo una soluzione da JMSSerializerBundle o FOSRestBundle per sovrascrivere il valore come da nostro requisito.

Soluzione finora posso impostare il valore predefinito in un'entità in modo che i nuovi dati avranno un certo valore di default nel database, invece di null. Ma questo non funziona per gli oggetti di relazione one-to-one/many-to-one, poiché restituiranno null di default invece di un oggetto vuoto.

Qualsiasi soluzione per sovrascrivere il json dopo la serializzazione?

risposta

4

Quando si utilizza il FOSRestBundle, nel file di configurazione (in genere app/config/config.yml) è possibile utilizzare queste impostazioni per evitare di dover valori nulli:

fos_rest: 
    serializer: 
     serialize_null: false 

Se si desidera un valore personalizzato, è possibile utilizzare il serializer.post_serializeevent.

PS: Per avere tutte le opzioni possibili previste dal fascio, digitare questo comando:

php bin/console config:dump-reference fos_rest 
+0

l'impostazione di questo falso rimuoverà il nulla pro perty dalla risposta completamente. Ma dobbiamo mostrare quella chiave con una stringa vuota. – Jeet

+0

Risposta aggiornata. – COil

+0

Grazie per l'aggiornamento. Ho visto 'serializer.post_serialize' fornendomi' ObjectEvent' che espone l'intera entità e non riesco a scoprire quale sia oggetto (nullable) ed è stato serializzato per API e deve essere impostato come oggetto/stringa vuoto. Penso che possiamo aggiungere solo nuove proprietà a 'ObjectEvent'. – Jeet

4

È possibile utilizzare un visitatore personalizzato per farlo:

<?php 

namespace Project\Namespace\Serializer; 

use JMS\Serializer\Context; 
use JMS\Serializer\JsonSerializationVisitor; 

class BlankSerializationVisitor extends JsonSerializationVisitor 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function visitNull($data, array $type, Context $context) 
    { 
     return ''; 
    } 
} 

E poi, impostarlo su il vostro serializzatore con il metodo setSerializationVisitor o nel file di configurazione:

# app/config/config.yml 
parameters: 
    jms_serializer.json_serialization_visitor.class: Project\Namespace\Serializer\BlankSerializationVisitor 
+1

Funziona solo se cancelli la cache! – meteorSD