如何将选项传递给 Symfony Serializer 组件中的 json_encode 函数

tar*_*ius 3 php serialization symfony fosrestbundle

这是情况:我在基于 symfony3 的 rest api 上工作,它使用 FOSRestBundle 和 symfony 序列化器组件,因此方法返回数组,FOSRest 处理编码和响应。问题是序列化程序使用带有默认设置的 json_encode 和某些符号的 api 返回数据,如 '\u00c9S'。所以我需要以某种方式将 'JSON_UNESCAPED_UNICODE' 传递给 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;
    }
Run Code Online (Sandbox Code Playgroud)

因此,当我请求“/get-some-data”时,它会返回我:

{"prop1":"Value with \/","prop2":"Value with \u00c9"}
Run Code Online (Sandbox Code Playgroud)

,但我需要它返回:

{"prop1":"Value with /","prop2":"Value with É"} 
Run Code Online (Sandbox Code Playgroud)

小智 6

Symfony 5 的解决方案。

自 Symfony 4.2 起,不推荐将整数作为“Symfony\Component\Serializer\Encoder\JsonEncode::__construct()”方法的第一个参数传递,而是使用上下文的“json_encode_options”键。

添加到 config/services.yaml:

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

serializer.encoder.json:
    class: Symfony\Component\Serializer\Encoder\JsonEncoder
    arguments:
        - '@serializer.encode.json.unescaped'
Run Code Online (Sandbox Code Playgroud)


小智 5

我使用 Symfony 3 和“Doctrine JSON ODM Bundle”将我的数据存储为 JSON 文档。我有同样的问题。所有包含 unicode 字符的数据都会自动转义,这不是我想要的。

经过一些实验,我终于设法将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'
Run Code Online (Sandbox Code Playgroud)