2015-07-23 12 views
6

Wir verwenden Symfony2 FOSRestBundle mit JMSSerializerBundle für die Entwicklung von REST-APIs, die von mobilen Entwicklern konsumiert werden.JMSSerializerBundle Show leerer Wert anstelle von Nullwert

Die API-Antwort im JSON-Format gibt 'null' als Wert der Eigenschaften zurück, wo immer dies der Fall ist, wodurch eine Ausnahme für die von mobilen Entwicklern verwendete 3rd-Party-Bibliothek generiert wird.

Ich sehe keine Lösung von JMSSerializerBundle oder FOSRestBundle, um den Wert gemäß unserer Anforderung zu überschreiben.

Umgehung bisher Ich kann den Standardwert in der Entität festlegen, so dass die frischen Daten einen Standardwert in der Datenbank haben, anstatt null. Dies funktioniert jedoch nicht für Eins-zu-Eins/Viele-zu-Eins-Beziehungsobjekte, da diese standardmäßig Null anstelle eines leeren Objekts zurückgeben.

Gibt es eine Lösung zum Überschreiben der JSON nach der Serialisierung?

Antwort

4

Wenn die FOSRestBundle in der Konfigurationsdatei (in der Regel app/config/config.yml) verwenden, können Sie diese Einstellungen verwenden, Nullwerte zu vermeiden, dass:

fos_rest: 
    serializer: 
     serialize_null: false 

Wenn Sie einen benutzerdefinierten Wert wollen, können Sie die serializer.post_serializeevent verwenden.

PS: alle möglichen Optionen durch das Bündel zur Verfügung gestellt haben, geben Sie diesen Befehl ein:

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

diese falsche Einstellung wird die Null pro entfernen Antwort von der Antwort vollständig. Aber wir müssen diesen Schlüssel mit einer leeren Zeichenfolge anzeigen. – Jeet

+0

Antwort aktualisiert. – COil

+0

Danke für die Aktualisierung. Ich sah 'serializer.post_serialize' und gab mir' ObjectEvent', was eine vollständige Entität freilegt und ich kann nicht herausfinden, welches Objekt (nullable) ist und für die API serialisiert wurde und als leeres Objekt/String gesetzt werden muss. Ich denke, wir können dem 'ObjectEvent' nur neue Eigenschaften hinzufügen. – Jeet

4

Sie einen benutzerdefinierten Besucher, das zu tun verwenden kann:

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

Und dann setzen Sie sich auf Ihre Serializer mit der setSerializationVisitor Methode oder in der Konfigurationsdatei:

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

Funktioniert nur, wenn Sie den Cache löschen! – meteorSD