symfony2: JMSSerializerBundle изменяет имя атрибута с className на class_name

Я использую JMSSerializerBundle для сериализации своей сущности. но у меня есть следующая проблема: имя атрибута - «className», но в моем объекте Json я получаю «class_name».

это моя сущность:

/**
 * Events
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Events
{
 /**
  * @var integer
  *
  * @ORM\Column(name="id", type="integer")
  * @ORM\Id
  * @ORM\GeneratedValue(strategy="AUTO")
  */
 private $id;

 ...

 /**
  * @var string
  *
  * @ORM\Column(name="className", type="string", length=255)
  */
 private $className;

 /**
  * Set className
  *
  * @param string $className
  * @return Events
  */
 public function setClassName($className)
 {
     $this->className = $className;

     return $this;
 }

 /**
  * Get className
  *
  * @return string 
  */
 public function getClassName()
 {
     return $this->className;
 }
 ...
}

это мой контроллер

  class myController extends Controller{

      public function loadAction($action){
        $request=$this->get('request');
        if($request->isXmlHttpRequest())
        {
         switch( $action ) {

            case 'load':
                 $resultat=$this->getDoctrine()->getManager()->getRepository('ECMUserBundle:Events')
                    ->findAll();
                $serializer = $this->get('jms_serializer');
                $resultat=$serializer->serialize($resultat, 'json');
                echo $resultat;
                exit();
                break;
            ...

и это мой Json

 [{"id":90,"title":"holliday","start":"2014-03-25T01:00:00+0000","end":"2014-03-25T01:00:00+0000","class_name":"label-orange","allday":"true"}]

это логическое поведение?


person Akram    schedule 29.03.2014    source источник
comment
Также обратите внимание на это: florian.voutzinos.com/blog/   -  person luso    schedule 04.10.2015


Ответы (4)


Проверьте документацию на аннотацию @SerializedName:

http://jmsyst.com/libs/serializer/master/reference/annotations

@SerializedName:

Эту аннотацию можно определить для свойства, чтобы определить сериализованное имя свойства. Если это не определено, свойство будет переведено из верблюжьего регистра в подчеркнутое имя в нижнем регистре, например camelCase -> camel_case.

person Mike    schedule 30.03.2014
comment
Спасибо. Мне нужно было добавить аннотации SerializedName, подобные этой @SerializedName (className), и использовать JMS \ Serializer \ Annotation \ SerializedName; - person Akram; 30.03.2014

Как сказал @mike, вы можете использовать аннотацию @SerializedName, чтобы изменить имя сериализованного свойства на произвольную строку.

Также, если вы хотите изменить стратегию именования на уровне приложения. Вы можете использовать следующий обходной путь:

config.yml

parameters:
    jms_serializer.serialized_name_annotation_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy

Также проверьте эту проблему.

person Slava Fomin II    schedule 08.04.2014

Если вы просто хотите использовать версию с верблюжьим футляром один раз, без аннотаций, используйте IdenticalPropertyNamingStrategy:

$serializer = SerializerBuilder::create()->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())->build();
person Linkmichiel    schedule 12.04.2016

Внутри Symfony имеет смысл использовать проход компилятора, так как он позволяет избежать потери аннотации @SerializedName.

<?php

namespace AppBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

class JMSSerializerCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container->getDefinition('jms_serializer.serialized_name_annotation_strategy')
                  ->replaceArgument(0, new Reference('jms_serializer.identical_property_naming_strategy'));
    }
}
person Lulhum    schedule 02.02.2018