2016-12-13 4 views
1

Voici la situation: Je travaille sur une API de repos, basée sur symfony3, elle utilise FOSRestBundle et le composant sérialiseur symfony, donc les méthodes return array et FOSRest gèrent l'encodage et la réponse. Le problème est l'utilisation du sérialiseur json_encode avec les paramètres par défaut et api renvoie des données comme '\ u00c9S' pour certains symboles. Je dois donc passer 'JSON_UNESCAPED_UNICODE' à json_encode() d'une manière ou d'une autre. Y a-t-il un moyen approprié d'atteindre ce but? Exemple d'une méthode:Comment passer des options à la fonction json_encode dans le composant 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; 
    } 

Alors, quand je demande à '/ get-some-données', il me retourne:

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

, mais je besoin pour revenir:

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

Répondre

1

Vous pouvez utiliser un codeur, que l'on trouve here et dans le documentation

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

EDIT:

Dans cet exemple, j'utilise un objet Response. Notez qu'un contrôleur d'action doit retourner un objet 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

Je n'ai pas compris. Je ne suis pas impliqué dans le processus de sérialisation, FOSRestBundle le gère. Devrais-je prolonger une classe? – tarasikarius

+0

Pouvez-vous donner un exemple de votre code? Je vais essayer d'adapter le mien. Mon code utilise uniquement le composant Symfony Serializer. – AnthonyB

+0

Ajouter un exemple à la question. – tarasikarius

0

J'utilise Symfony 3 et la "doctrine JSON ODM Bundle" pour stocker mes données sous la cote JSON. J'ai eu le même problème. Toutes les données qui contenaient des caractères Unicode se sont échappées automatiquement ce qui n'était pas ce que je voulais.

Après quelques expériences j'ai finalement réussi à passer JSON_UNESCAPED_UNICODE option json_encode(). Ci-dessous est ma solution:

# 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'