我正在使用JMSSerializerBundle,并且注意到序列化时的一种奇怪行为。
我使用的是$jsonItems =$序列化器->序列化( $invoiceitems,'json');其中$invoiceitems如下:
array(2) {
["services"]=>
array(3) {
[1]=>
array(1) {
[0]=>
object(stdClass)#757 (26) {
["__CLASS__"]=>
string(43) "Evo\BackendBundle\Entity\InvoiceItemService"
["id"]=>
int(4)
}
}
[2]=>
array(0) {
}
[3]=>
array(1) {
[1]=>
object(stdClass)#846 (26) {
["__CLASS__"]=>
string(43) "Evo\BackendBundle\Entity\InvoiceItemService"
["id"]=>
int(7)
}
}
}
["marchandises"]=>
array(0) {
}
}我得到以下JSON:
{"services"{
"1":[
{"realDiscount":0,"id":4,"createdAt":"2014-08-22","description":"test 2","type":1,"totalFlat":75,"discountFlat":0,"discountFlatType":"%","chargedHours":0,"chargedMinutes":0,"hourlyRate":0,"discountHourly":0,"discountHourlyType":"%","chargedQuantity":0,"unitPrice":0,"discountQuantity":0,"discountQuantityType":"%","total":75,"discount":0,"discountType":"%","position":1,"chargedTime":0}
],
"2":[],
"3":{
"1":{"realDiscount":0,"id":7,"createdAt":"2014-08-22","description":"test 22","type":3,"totalFlat":0,"discountFlat":0,"discountFlatType":"%","chargedHours":0,"chargedMinutes":0,"hourlyRate":0,"discountHourly":0,"discountHourlyType":"%","chargedQuantity":50,"unitPrice":1,"discountQuantity":0,"discountQuantityType":"%","total":50,"discount":0,"discountType":"%","position":1,"chargedTime":0}
}
},
"marchandises":[]}为什么在我的JSON字符串中,services1的格式与services3不同?如果我引用我的PHP数组,唯一的区别是services1的第一个键是0,而services3的第一个键是1,就像JMS序列化器在键等于0时不映射键一样。最后,我希望在JSON字符串中保持键等于0。
我怎么能这么做?
发布于 2014-08-22 16:02:11
要将此逻辑应用于整个项目:
只需将这些行添加到序列化程序配置(config.yml):
jms_serializer:
visitors:
json:
options: [JSON_FORCE_OBJECT]来源:http://jmsyst.com/bundles/JMSSerializerBundle/master/configuration#extension-reference
若要在每次调用中应用此逻辑:
您必须创建一个EventSubscriber
<?php
namespace Acme\Api\Serializer;
use JMS\Serializer\EventDispatcher\Events;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use JMS\Serializer\JsonSerializationVisitor;
class JsonSerializationSubscriber implements EventSubscriberInterface
{
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return array(
array('event' => Events::PRE_SERIALIZE, 'method' => 'onPreSerialization', 'format' => 'json'),
array('event' => Events::POST_SERIALIZE, 'method' => 'onPostSerialization', 'format' => 'json')
);
}
/**
* @param PreSerializeEvent $event
*/
public function onPreSerialization(PreSerializeEvent $event)
{
$context = $event->getContext();
if (!$context->attributes->contains('json_encode_options')) {
return;
}
$visitor = $event->getVisitor();
if ($visitor instanceof JsonSerializationVisitor) {
$options = $visitor->getOptions();
$context->setAttribute('__old_json_encode_options', $options);
$visitor->setOptions($options | $context->attributes->get('json_encode_options'));
}
}
/**
* @param ObjectEvent $event
*/
public function onPostSerialization(ObjectEvent $event)
{
$context = $event->getContext();
if (!$context->attributes->contains('__old_json_encode_options')) {
return;
}
$visitor = $event->getVisitor();
if ($visitor instanceof JsonSerializationVisitor) {
$visitor->setOptions($context->attributes->get('__old_json_encode_options'));
}
}
}在配置文件中注册EventSubscriber:
services:
acme.serializer.subscriber.json:
class: Acme\Api\Serializer\JsonSerializationSubscriber
tags:
- {name: jms_serializer.event_subscriber}然后,每当您想要使用它时:
$context = new SerializationContext();
$context->setAttribute('json_encode_options', JSON_FORCE_OBJECT);
$this->get('serializer')->serialize($var, 'json', $context);https://stackoverflow.com/questions/25450970
复制相似问题