2015-07-23 28 views
6

Używamy Symfony2 FOSRestBundle z JMSSerializerBundle do tworzenia interfejsów API REST, które będą używane przez programistów mobilnych.JMSSerializerBundle Wyświetl pustą wartość zamiast wartości pustej

Odpowiedź interfejsu API w formacie JSON zwraca wartość "null" jako wartość właściwości wszędzie tam, gdzie ma to zastosowanie, co powoduje wygenerowanie wyjątku dla biblioteki zewnętrznej używanej przez programistów mobilnych.

Nie widzę rozwiązania z JMSSerializerBundle lub FOSRestBundle, aby nadpisać wartość zgodnie z naszymi wymaganiami.

Obejście do tej pory Mogę ustawić wartość domyślną w jednostce tak, aby nowe dane miały pewną wartość domyślną w bazie danych zamiast wartości zerowej. Ale to nie działa dla obiektów relacji jeden do jednego/wielu do jednego, ponieważ te zwracają domyślnie wartość zerową zamiast pustego obiektu.

Jakieś rozwiązanie nadpisania json po serializacji?

Odpowiedz

4

Podczas korzystania z FOSRestBundle, w pliku konfiguracyjnym (ogólnie app/config/config.yml) można użyć tego ustawienia, aby uniknąć wartości null:

fos_rest: 
    serializer: 
     serialize_null: false 

Jeśli chcesz niestandardową wartość, można użyć serializer.post_serializeevent.

PS: Aby mieć wszystkie możliwe opcje dostarczonych przez pakiet, należy wpisać polecenie:

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

Ustawienie tej wartości spowoduje usunięcie wartości null pro perty od odpowiedzi całkowicie. Ale musimy pokazać ten klucz z pustym łańcuchem. – Jeet

+0

Odpowiedź zaktualizowana. – COil

+0

Dziękujemy za aktualizację. Widziałem 'serializer.post_serialize' podając mi' ObjectEvent', który eksponuje pełny byt i nie mogę stwierdzić, który z nich jest obiektem (nullable) i został zeskanowany dla API i musi być ustawiony jako pusty obiekt/ciąg. Myślę, że możemy dodać nowe właściwości do 'ObjectEvent'. – Jeet

4

Można użyć niestandardowego odwiedzającego to zrobić:

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

A następnie ustawić go do serializator za pomocą metody setSerializationVisitor lub w pliku konfiguracyjnym:

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

Działa tylko po wyczyszczeniu pamięci podręcznej! – meteorSD