symfony2: JMSSerializerBundle изменяет имя атрибута с "className" на " class name"
Я использую jmsserializerbundle для сериализации моей сущности. но у меня есть следующая проблема: имя атрибута - "className", но в моем объекте Json я получаю "class_name".
Это моя сущность:
/**
* Events
*
* @ORMTable()
* @ORMEntity
*/
class Events
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
...
/**
* @var string
*
* @ORMColumn(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"}]
Это логичное поведение?
4 ответов
проверьте документацию для аннотации @SerializedName:
http://jmsyst.com/libs/serializer/master/reference/annotations
@SerializedName:
эта аннотация может быть определена в свойстве для определения сериализованного имени свойства. если это не определено, свойство будет переведено из регистра camel в подчеркнутое имя с более низким регистром, например camelCase - > camel_case.
как сказал @mike, вы можете использовать @SerializedName
аннотация для изменения имени сериализованного свойства на произвольную строку.
также, если вы хотите изменить стратегию именования на уровне приложения. Вы можете использовать следующий обходной путь:
config.в формате YML
parameters:
jms_serializer.serialized_name_annotation_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy
кроме того, проверьте этот вопрос.
Если вы просто хотите использовать версию camel case один раз, без аннотаций, используйте IdenticalPropertyNamingStrategy
:
$serializer = SerializerBuilder::create()->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())->build();
внутри 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'));
}
}