2016-12-13 3 views
1

вот такая ситуация: я работаю на отдыхе api на основе symfony3, он использует компонент FOSRestBundle и symfony serializer, поэтому методы возвращают массив, а FOSRest обрабатывает кодирование и ответ. Проблема заключается в использовании сериализатора json_encode с настройками по умолчанию и возвратными данными api, такими как «\ u00c9S» для некоторых символов. Поэтому мне нужно как-то передать JSON_UNESCAPED_UNICODE на json_encode(). Есть ли правильный способ достичь этой цели? Пример метода:Как передать параметры функции json_encode в компоненте Symfony Serializer

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use FOS\RestBundle\Controller\Annotations as Rest; 
use Nelmio\ApiDocBundle\Annotation\ApiDoc; 
use Symfony\Component\HttpFoundation\Request; 

/** 
* Class ExampleController 
* @package AppBundle\Controller 
*/ 
class ExampleController extends Controller 
{ 
    /** 
    * @Rest\Get("/get-some-data") 
    * @param Request $request 
    * @return array 
    */ 
    public function getSomeDataAction(Request $request) 
    { 
     $someData = [ 
      'prop1' => 'Value', 
      'prop2' => 'Value', 
      'prop3' => 'Value', 
      'prop4' => 'Value', 
     ]; 

     return $someData; 
    } 

Так что, когда я делаю запрос на '/ Get-какой-данных', он возвращает меня:

{"prop1":"Value with \/","prop2":"Value with \u00c9"} 

, но мне нужно, чтобы вернуться:

{"prop1":"Value with /","prop2":"Value with É"} 

ответ

1

Вы можете использовать кодер, как найдено here и в documentation

<?php 
$encoder = new JsonEncoder(new JsonEncode(JSON_UNESCAPED_UNICODE), new JsonDecode(false)); 
$normalizer = new ObjectNormalizer(); 
$serializer = new Serializer(array($normalizer), array($encoder)); 

EDIT:

В этом примере я использую объект Response. Обратите внимание, что контроллер действия должен вернуть объект Response.

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use FOS\RestBundle\Controller\Annotations as Rest; 
use Nelmio\ApiDocBundle\Annotation\ApiDoc; 
use Symfony\Component\HttpFoundation\Request; 

/** 
* Class ExampleController 
* @package AppBundle\Controller 
*/ 
class ExampleController extends Controller 
{ 
    /** 
    * @Rest\Get("/get-some-data") 
    * @param Request $request 
    * @return array 
    */ 
    public function getSomeDataAction(Request $request) 
    { 
     $someData = [ 
      'prop1' => 'Value', 
      'prop2' => 'Value', 
      'prop3' => 'Value', 
      'prop4' => 'Value', 
     ]; 
     $response = new Response($someData); 
     $response->headers->set('Content-Type', 'application/json'); 
     return $response; 
    } 
+0

Я не понял. Я не вовлечен в процесс сериализации, FOSRestBundle обрабатывает его. Должен ли я расширить класс? – tarasikarius

+0

Можете привести пример своего кода? Я постараюсь адаптировать свои собственные. В моем коде используется только компонент Symfony Serializer. – AnthonyB

+0

Добавьте пример к вопросу. – tarasikarius

0

Я использую Symfony 3 и "Доктрина JSON ODM Bundle" хранить свои данные в виде JSON-документа. У меня такая же проблема. Все данные, содержащие символы Юникода, которые автоматически избегали, что было не то, что я хотел.

После некоторых экспериментов мне наконец удалось передать JSON_UNESCAPED_UNICODE вариант json_encode(). Ниже мое решение:

# config/services.yml 

    serializer.encode.json.unescaped: 
     class: Symfony\Component\Serializer\Encoder\JsonEncode 
     arguments: 
      - !php/const JSON_UNESCAPED_UNICODE 

    serializer.encoder.json: 
     class: Symfony\Component\Serializer\Encoder\JsonEncoder 
     arguments: 
      - '@serializer.encode.json.unescaped'