1. ホーム
  2. php

[解決済み] シリアライザがダブルクォートをエスケープして \u0022 にならないようにするにはどうしたらいいですか?

2022-02-11 22:57:25

質問

コントローラで JsonResponse :

public function index(CkeditorTemplateRepository $ckeditorTemplateRepository, SerializerInterface $serializer): Response
{
    $data = $ckeditorTemplateRepository->findAll();
    return new JsonResponse($serializer->serialize($data, 'json'));
}

しかし、このエンドポイントをリクエストすると、レスポンスにあまりにも多くの \u の接頭辞があります。

"[{\u0022created\u0022:\u00222019-08-31T07:28:56+00:00\u0022,\u0022id\u0022:1,\u0022content\u0022: \u0022\u003Ctr\u003E\u003Ctd height=\\u002252\\u0022 valign=\\u0022bottom\\u0022 class=\\u0022h24\\u0022\u003E\u003Cspan class=\\u0022h21copy1\\u0022\u003E\u5b66\u4e60\u56de\u526f\u603b\u7406\u7684\u8bb2\u8bdd \u003C\/span\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd valign=\\u0022top\\u0022\u003E\u003Cp style=\\u0022margin- の下にあります。 10\\u0022 align=\\u0022center\\u0022 class=\\u0022font6\\u0022\u003E\u003C\/p\u003E\u003C\/td\u003E\u003C\/tr\u003E\u0022}]"

解決方法は?

問題は、あなたのやり方が間違っていることです。

JsonResponse はレスポンスオブジェクトで、レスポンスデータのJSONへのシリアライズを支援します。

でも、セラリゼーションはすでに自分でやっているので、ちょっと冗長ですね。

いくつかのオプションがあります。

return (new Response($serializer->serialize($data, 'json'))
    ->headers->set('Content-type', 'application/json');

あるいは JsonResponse :

return (new JsonResponse())->setContent($serializer->serialize($data, 'json'));

またはインスタンス化 JsonResponse から直接 ファクトリーメソッド :

return JsonResponse::fromJsonString($serializer->serialize($data, 'json'));

(いずれの場合も、JsonResponseがそれを行うので、コンテンツタイプを設定する必要はありません)。

そうすると

new JsonResponse($data);

というレスポンスが返されます。 content は、JSONをシリアライズした $data . これは 単純なデータ構造 を呼び出せば、簡単にシリアライズできます。 json_encode . しかし、あなたはすでにJSON文字列を送信していたので、この方法でデータを2回シリアライズすることになります。