如何在Symfony序列化的JSON中显示西里尔符号?
解决Symfony序列化Unicode转义及双重编码问题
1. 配置JSON编码选项解决Unicode转义
你可以通过两种方式给Symfony的JsonEncoder添加JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES选项:
方式一:实例化JsonEncoder时指定选项
修改JsonEncoder的实例代码,传入带编码选项的JsonEncode对象:
use Symfony\Component\Serializer\Encoder\JsonEncode; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Encoder\JsonDecode; // ... $encoder = new JsonEncoder( new JsonEncode([ 'json_encode_options' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ]), new JsonDecode() );
方式二:在serialize方法中传入上下文参数
保持JsonEncoder默认实例,在调用serialize时通过第三个参数传入编码选项:
$data = $serializer->serialize( $items, 'json', [JsonEncoder::OPTIONS => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES] );
2. 修复双重编码问题
你的代码最后一行return $this->json($data);存在双重编码问题:$serializer->serialize()已经生成了JSON字符串,而$this->json()会再次对该字符串执行json_encode,最终返回的是一个包含JSON字符串的JSON(外层多了一层引号)。
解决方法二选一:
- 直接返回JSON字符串作为响应:
use Symfony\Component\HttpFoundation\Response; // ... return new Response($data, 200, ['Content-Type' => 'application/json']); - 或者将序列化结果解码为数组后传给
json()方法:$dataArray = json_decode($data, true); return $this->json($dataArray);
完整示例代码
$items = $this->entityManager->getRepository(OrderMainCategory::class)->findAll(); // 配置JsonEncoder带编码选项 $encoder = new JsonEncoder( new JsonEncode([ 'json_encode_options' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ]), new JsonDecode() ); $defaultContext = [ AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object) { return $object->getName(); }, ]; $normalizer = new ObjectNormalizer(null, null, null, null, null, null, $defaultContext); $serializer = new Serializer([$normalizer], [$encoder]); $data = $serializer->serialize($items, 'json'); // 直接返回JSON响应,避免双重编码 return new Response($data, 200, ['Content-Type' => 'application/json']);
内容的提问来源于stack exchange,提问作者TsarS
相关产品推荐
相关产品推荐

