Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JMSSerializerBundle Show blank value instead of null value

We are using Symfony2 FOSRestBundle with JMSSerializerBundle for developing REST APIs to be consumed by mobile developers.

The API response in JSON format returns 'null' as value of properties wherever applicable, which is generating an exception for the 3rd party library being used by mobile developers.

I don't see a solution from JMSSerializerBundle or FOSRestBundle to overwrite the value as per our requirement.

Workaround so far I can set default value in entity so that the fresh data will have some default value in database, instead of null. But this doesn't work for a one-to-one/many-to-one relationship objects, as those will return null by default instead of blank object.

Any solution to overwrite the json after serialization ?

like image 349
Jeet Avatar asked Jul 23 '15 07:07

Jeet


2 Answers

You can use a custom visitor to do that:

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

And then, set it to your serializer with the setSerializationVisitor method or in your config file:

# app/config/config.yml
parameters:
    jms_serializer.json_serialization_visitor.class: Project\Namespace\Serializer\BlankSerializationVisitor
like image 133
Seb33300 Avatar answered Sep 30 '22 12:09

Seb33300


When using the FOSRestBundle, in your configuration file (generally app/config/config.yml) you can use this settings to avoid having null values:

fos_rest:
    serializer:
        serialize_null: false

If you want a custom value, you can use the serializer.post_serialize event.

PS: To have all possible options provided by the bundle, type this command:

php bin/console config:dump-reference fos_rest
like image 30
COil Avatar answered Sep 30 '22 12:09

COil