2016-12-13 1 views
1

다음은 상황입니다. symfony3을 기반으로 나머지 API에서 작업하고 FOSRestBundle 및 symfony serializer 구성 요소를 사용하므로 배열을 반환하고 FOSRest가 인코딩 및 응답을 처리합니다. 문제는 serializer에서 json_encode를 기본 설정으로 사용하고 api가 일부 기호에 '\ u00c9S'와 같은 데이터를 반환한다는 것입니다. 그래서 어떻게 든 JSON_UNESCAPED_UNICODE를 json_encode()에 전달해야합니다. 이 목표에 도달하기위한 적절한 방법이 있습니까? 방법의 예 : 그래서Symfony Serializer 구성 요소의 json_encode 함수에 옵션을 전달하는 방법

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; 
    } 

내가 요청을 할 '/ - 일부 데이터를 가져 오기', 그것이 나 반환

{"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)); 
에서

편집 :

이 예제에서는 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

나는 심포니 3과 "교리 JSON ODM 번들"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' 
관련 문제