JMS Serializer: how to use camel case for properties
Asked Answered
T

5

11

I'm using FOS Rest bundle and JMS Serializer to create a REST Api. The problem is I would like to keep the property names in the JSON response camel cased instead of using _.

For example, I have a property called employeeIdentifier, by default that gets converted to employee_identifier.

I saw that there's an option in the config to disable the lowercase and get rid of the _, but then it becomes EmployeeIdentifier.

Is there any way that JMS Serializer keeps the original name of the property? Thanks in advance

Tilsit answered 20/4, 2017 at 20:26 Comment(0)
K
42

I found a way to do it globally, if you want to keep the property names as is you need to use the IdenticalPropertyNamingStrategy

There are several ways to accomplish this, first by changing the config(Thanks @Phantom):

#config.yml
jms_serializer:
    property_naming: 
        id: 'jms_serializer.identical_property_naming_strategy'

Second, you could override the default alias for this

services:
    jms_serializer.naming_strategy:
        alias: jms_serializer.identical_property_naming_strategy

The bundle defines these https://github.com/schmittjoh/JMSSerializerBundle/blob/master/Resources/config/services.xml so you should be able to override them

Another way to do it is when you initialize the builder:

$serializebuilder = JMS\Serializer\SerializerBuilder::create();
$serializebuilder->setPropertyNamingStrategy(new \JMS\Serializer\Naming\IdenticalPropertyNamingStrategy());
$serializer = $serializebuilder->build();
Krp answered 20/4, 2017 at 20:41 Comment(10)
no, that doesnt make any difference just removes the separador, so employeeIdentifier gets employeeidentifierTilsit
@Tilsit did a little more digging found what you are looking forKrp
seems like it should work, but I get this error You have requested a non-existent parameter "jms_serializer.identical_property_naming_strategy.class".Tilsit
@Tilsit I updated the answer with a different method.Krp
Thanks this helped meHamill
You may also change strategy not by overriding a service alias, but instead changing your config, e.g. in config.yml jms_serializer: property_naming: id: 'jms_serializer.identical_property_naming_strategy'Sulfonation
added to config > packages > jms_serializer.yaml in SF4; does not seem to workBanditry
While this works, it doesn't allow the serialized names from being overridden. For instance, <property name="idPublic" serialized-name="id" expose="true"/> outputs idPublic and not id.Monney
This helped me, using JMSSerializer 2.4Pyroligneous
Worked for me with this config in config/packages/jms_serializer.yaml : jms_serializer: property_naming: id: jms_serializer.identical_property_naming_strategy and removing the cache manually github.com/schmittjoh/serializer/issues/1037Pasto
P
5

Having upgraded jms/serilizer-bundle from 1.1 to 2.2 the parameter hack described above did not work. You can override the service definition as follows:

#app/config/services.yml
services:
    ....
    jms_serializer.serialized_name_annotation_strategy:
        class: JMS\Serializer\Naming\SerializedNameAnnotationStrategy
        arguments:
            - '@jms_serializer.identical_property_naming_strategy'
Protection answered 13/3, 2019 at 10:42 Comment(2)
Works on Symfony 5.2 & jms/serializer-bundle: ^3.3Biotype
Works on "jms/serializer-bundle": "^4.0" and symfony 5.4Vancouver
P
3

Worked for me (Symfony 4.4 and JMS ^3.8) with this config in config/packages/jms_serializer.yaml :

jms_serializer:
    property_naming:
        id: jms_serializer.identical_property_naming_strategy

and removing the cache manually

https://github.com/schmittjoh/serializer/issues/1037

Pasto answered 8/4, 2021 at 17:27 Comment(0)
T
1

I found a way to do it but it's not the best way I think, there's an annotation SerializedName wich allows you to override the property serialization. The problem is that you have to do it one by one on every property with camel case, here's the documentation: YAML: http://jmsyst.com/libs/serializer/master/reference/yml_reference Annotation: http://jmsyst.com/libs/serializer/master/reference/annotations#serializedname

Tilsit answered 21/4, 2017 at 7:42 Comment(0)
P
0

I had to add the following to parameters.yml instead of config.yml:

jms_serializer.serialized_name_annotation_strategy.class: JMS\Serializer\Naming\SerializedNameAnnotationStrategy

Pyroligneous answered 25/2, 2020 at 10:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.