2014-03-29 6 views
6

Ich verwende den JMSSerializerBundle, um meine Entität zu serialisieren. aber ich habe das folgende Problem: der Attributname ist "Klassenname", aber in meinem Json-Objekt erhalte ich einen "Klassenname".symfony2: JMSSerializerBundle ändert den Attributnamen von "className" in "class_name"

das ist meine Einheit:

/** 
* 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; 
} 
... 
} 

dies mein Controller

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; 
      ... 

und das ist meine 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"}] 

ist dies die logische Verhalten?

+0

prüfen dies auch aus: https://florian.voutzinos.com/blog/handling-camelcase-with-fosrestbundle/ – luso

Antwort

4

Überprüfen Sie die Dokumentation für die @SerializedName Anmerkung:

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

@SerializedName:

Diese Anmerkung kann auf eine Eigenschaft definiert werden, um die serialisierten Name für eine Eigenschaft zu definieren. Wenn dies nicht definiert ist, wird die Eigenschaft von camel-case in einen unterstrichenen Namen mit niedrigerem Gehäuse, z. camelCase -> camel_case.

+0

danke. Ich musste SerializedName-Annotationen wie diese @SerializedName ("Klassenname") hinzufügen und "JMS \ Serializer \ Annotation \ SerializedName" verwenden. – Akram

22

Wie @ Mike sagte: Sie @SerializedName Anmerkung verwenden können serialisiert Eigenschaftsnamen beliebige Zeichenfolge zu ändern.

Auch wenn Sie die Benennungsstrategie auf Anwendungsebene ändern möchten. Sie können die folgende Abhilfe verwenden:

config.yml

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

Auch this issue überprüfen.

+0

Wow !!! Danke vielmals! –

4

Wenn Sie das Kamel Fall Version nur einmal verwenden möchten, ohne Anmerkungen, verwenden Sie die IdenticalPropertyNamingStrategy:

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

Innen Symfony, es viel mehr Sinn machen, einen Compiler Pass zu verwenden, da es die @SerializedName verlieren vermeiden Anmerkung.

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