我正在使用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"}]
这是逻辑行为吗?
答案 0 :(得分:22)
正如@mike所说,您可以使用@SerializedName
注释将序列化属性名称更改为任意字符串。
此外,如果您想在应用程序级别更改命名策略。您可以使用以下解决方法:
<强> config.yml 强>
parameters:
jms_serializer.serialized_name_annotation_strategy.class: JMS\Serializer\Naming\IdenticalPropertyNamingStrategy
另外,请检查this issue。
答案 1 :(得分:5)
检查@SerializedName注释的文档:
http://jmsyst.com/libs/serializer/master/reference/annotations
@SerializedName:
可以在属性上定义此注释,以定义属性的序列化名称。 如果未定义此属性,则该属性将从驼峰大小写转换为较低级别的强制名称,例如camelCase - &gt; camel_case 强>
答案 2 :(得分:5)
如果您只想使用驼峰案例版本一次而不使用注释,请使用IdenticalPropertyNamingStrategy
:
$serializer = SerializerBuilder::create()->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())->build();
答案 3 :(得分:0)
在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'));
}
}