【Django】日本語を含むJsonを返す方法2つ
DjangoのRest APIでJsonを返そうと思ったら思いの外ハマったポイントがあるのでまとめます。
何にハマった?
DjangoのAPIで商品モデル(Product)のデータを取得し、フロントのJavascriptで描画する、というものを作成していました。 そこで、jsonデータ自体は返せるもの、商品モデルのnameに日本語を使った文字列が入っているので、文字化けが発生。
Jsonの文字化けを防ぐため、色々と調べるとjson.dumps
でJSON文字列を作るときにensure_ascii
パラメータをFalse
に設定すると良い、という情報が
たくさん見つかりました。
これを参考に、以下のようなコードを組みましたが、今度はフロントエンド側でjson文字列がJSON.parce()
で正常に配列化されない。
gist.github.com
ここでハマりました。
原因
一度Json.dumps
でJson文字列を作っているのに、JsonResponse
でJson文字を再度Json化しようとしていたせいでした。
JsonResponseの実装を見ると
data=json.dumps(...)
でjson化しています。
ということは、JsonResponseを使うときはJson.dumpsしていない生のlistやdictを渡す必要があります。
公式DocにもdataはDictインスタンスを渡してね、って書いてありました。(・_・;) 悩んだら公式Docを読もう… docs.djangoproject.com
で、文字化けはどうするの?
JsonResponse
を使う場合、JsonResposneの引数json_dumps_params
にdump時のパラメータを渡せるので、
{"ensure_ascii"=False}
をパラメータと渡せば意図した結果になります。
JSONデータを返す2つの実装方法
というわけで、JSONデータを返すための実装方法はjson.dumps
を使ってHttpResponse
で返すか、JsonResponse
を使うか、になります。
JsonResponse版
こっちがスマート。 gist.github.com
HttpResponse版
Content-Typeをつけ忘れそうな気もする gist.github.com
近況
最近、Djangoでとあるサービスを開発したのですがより使いやすく・自然な操作感のUXデザインを実現するべく、
フロントエンドフレームワークのVue.js
を勉強しています。
フロントエンドフレームワークは初めて触るのでかなり手こずっていますが、勉強が一段落したら感想とか書いていきたいですね。