首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMSSerializerBundle不映射键等于0

JMSSerializerBundle不映射键等于0
EN

Stack Overflow用户
提问于 2014-08-22 15:52:51
回答 1查看 1.3K关注 0票数 0

我正在使用JMSSerializerBundle,并且注意到序列化时的一种奇怪行为。

我使用的是$jsonItems =$序列化器->序列化( $invoiceitems,'json');其中$invoiceitems如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{"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。

我怎么能这么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-22 16:02:11

要将此逻辑应用于整个项目:

只需将这些行添加到序列化程序配置(config.yml):

代码语言:javascript
复制
jms_serializer:    
    visitors:
        json:
            options: [JSON_FORCE_OBJECT]

来源:http://jmsyst.com/bundles/JMSSerializerBundle/master/configuration#extension-reference

若要在每次调用中应用此逻辑:

您必须创建一个EventSubscriber

代码语言:javascript
复制
<?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

代码语言:javascript
复制
services:
    acme.serializer.subscriber.json:
        class: Acme\Api\Serializer\JsonSerializationSubscriber

        tags:
            - {name: jms_serializer.event_subscriber}

然后,每当您想要使用它时:

代码语言:javascript
复制
$context = new SerializationContext();
$context->setAttribute('json_encode_options', JSON_FORCE_OBJECT);

$this->get('serializer')->serialize($var, 'json', $context);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25450970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档