2015-07-23 1 views
6

Nous utilisons Symfony2 FOSRestBundle avec JMSSerializerBundle pour développer des API REST à utiliser par les développeurs mobiles.JMSSerializerBundle Afficher la valeur vide au lieu de la valeur nulle

La réponse de l'API en s null 'retourne format JSON en tant que valeur de propriétés applicables chaque fois, ce qui génère une exception pour la bibliothèque troisième partie étant utilisée par les développeurs mobiles.

Je ne vois pas une solution de JMSSerializerBundle ou FOSRestBundle pour remplacer la valeur selon nos besoins.

Solution jusqu'à présent je peux définir la valeur par défaut dans l'entité de telle sorte que les nouvelles données auront une valeur par défaut dans la base de données, au lieu de null. Mais cela ne fonctionne pas pour les objets de relation un-à-un/plusieurs-à-un, car ceux-ci renverront null par défaut au lieu de l'objet vide.

Toute solution pour remplacer le JSON après sérialisation?

Répondre

4

Lorsque vous utilisez le FOSRestBundle, dans votre fichier de configuration (généralement app/config/config.yml) vous pouvez utiliser ces paramètres pour éviter d'avoir des valeurs nulles:

fos_rest: 
    serializer: 
     serialize_null: false 

Si vous voulez une valeur personnalisée, vous pouvez utiliser le serializer.post_serializeevent.

PS: Pour avoir toutes les options possibles fournies par le paquet, tapez cette commande:

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

La définition de cette valeur supprimera le null pro perty de la réponse complètement. Mais nous devons montrer cette clé avec une chaîne vide. – Jeet

+0

Réponse mise à jour. – COil

+0

Merci pour la mise à jour. J'ai vu 'me donner serializer.post_serialize'' ObjectEvent' qui expose une entité complète et je ne peux pas savoir que l'on est l'objet (annulable) et a été serialzed pour API et doit être défini comme objet vide/string. Je pense que nous pouvons seulement ajouter de nouvelles propriétés à 'ObjectEvent'. – Jeet

4

Vous pouvez utiliser un visiteur personnalisé pour le faire:

<?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 ''; 
    } 
} 

Et puis, réglez-le votre sérialiseur avec la méthode setSerializationVisitor ou dans votre fichier de configuration:

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

Ne fonctionne que si vous effacez le cache! – meteorSD