7

Can someone help me with this? I'm trying to serialize an object to json using the Symfony Serializer, it does convert object to json but it doesnt convert an array of objects from camelCase to snake_case.

Im currently using the default Serializer with Symfony 3.3

Below is my code.

app/config/config.yml

 framework: 
  serializer:  
    enabled: true
    name_converter: 'serializer.name_converter.camel_case_to_snake_case'

app/config/services.yml

 services:
    get_set_method_normalizer:
        class:Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
        public: true
        tags: [serializer.normalizer]

Persons.php

class Person{
     private $firstName;
     private $lastName;
     private $email;

     //setters and getters
}

PersonController.php

class PersonController extends Controller {
     /**
      * @Route("api/person")
      * @Method("POST")
      */
     public function person(){
         $person = new Person();
          $person->setFirstName("test");
          $person->setLastName("test");
          $person->setEmail("[email protected]");

         $person1 = new Person();
         $person1->setFirstName("test 1");
          $person1->setLastName("test 1");
          $person1->setEmail("[email protected]");
         $arr = array($person, $person1);
         $serializer = $this->get("serializer");
         return new Response($serializer->serialize($arr,"json"));
     }

}

Below is the current output.

[
  {
     "firstName":"test",
     "lastName":"test"
     "email":"[email protected]"
  },
  {
     "firstName":"test 1",
     "lastName":"test 1"
     "email":"[email protected]"
  }
]

Expected output would be:

 [
   {
      "first_name":"test",
      "last_name":"test",
      "email":"[email protected]"
   },
   {
      "first_name":"test 1",
      "last_name":"test 1",
      "email":"[email protected]"
   }
]
2
  • Using your code above, I get the expected output on my machine. You're sure you cleared the cache? Can you post the use Statements? Commented Nov 30, 2017 at 14:31
  • I have the same problem on Symfony 4. I gave up and switch to Jms Serializer. Commented Apr 22, 2018 at 14:09

3 Answers 3

4

For symfony 4 this worked for me:

Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer:
    public: true
    arguments: ['@serializer.mapping.class_metadata_factory', '@serializer.name_converter.camel_case_to_snake_case']
    tags: [serializer.normalizer]

Put that code inside your app/config/services.yaml, inside the "services" section.

Sign up to request clarification or add additional context in comments.

Comments

2

try explicitly pass arguments for your service:

get_set_method_normalizer:
        class:Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
        public: true
        arguments: ['@serializer.mapping.class_metadata_factory', '@serializer.name_converter.camel_case_to_snake_case']
        tags: [serializer.normalizer]

Comments

1

It is easier to add an alias for camel_case_to_snake_case

services:
    ...
    Symfony\Component\Serializer\NameConverter\NameConverterInterface: '@serializer.name_converter.camel_case_to_snake_case'

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.