【问题标题】:symfony2: JMSSerializerBundle changes the attribute name from "className" to "class_name"symfony2:JMSSerializerBundle 将属性名称从“className”更改为“class_name”
【发布时间】:2014-03-29 23:53:13
【问题描述】:

我正在使用 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"}]

这是合乎逻辑的行为吗?

【问题讨论】:

标签: json symfony jmsserializerbundle


【解决方案1】:

正如@mike 所说,您可以使用@SerializedName 注释将序列化的属性名称更改为任意字符串。

此外,如果您想在应用程序级别更改命名策略。您可以使用以下解决方法:

config.yml

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

另外,请检查this issue

【讨论】:

    【解决方案2】:

    查看@SerializedName 注释的文档:

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

    @SerializedName:

    可以在属性上定义此注释以定义属性的序列化名称。 如果未定义,则属性将从驼峰式转换为小写下划线名称,例如camelCase -> camel_case。

    【讨论】:

    • 谢谢。我需要添加这样的 SerializedName 注释 @SerializedName("className") 和 "use JMS\Serializer\Annotation\SerializedName;"
    【解决方案3】:

    如果您只想使用一次驼峰式版本,不带注释,请使用IdenticalPropertyNamingStrategy

    $serializer = SerializerBuilder::create()->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())->build();
    

    【讨论】:

      【解决方案4】:

      在 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'));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 2012-03-01
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多