質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.54%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3800閲覧

flask で自作クラスをJSON変換すると、バックスラッシュが入ってしまう

tfline_w

総合スコア36

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/21 10:56

編集2018/09/21 10:59

Python3.6 + Flask + Flask_restful を使用して、簡単なWeb API を作成しています。
仕様としては、get でパラメータを送信すると、JSON 形式の情報が戻る、というものです。
動作はするのですが、結果のJSONの中に不要なバックスラッシュが入ってしまい、これを消す方法がないかと質問させていただきます。

python

1import json 2 3class SampleDto(object): 4 5 data1 = None 6 data2 = 0 7 errorMessage = None; 8 9 def __init__(self): 10 pass

と、dto を定義しておき、

python

1 def get(self, aLoginKey): 2    : 3   (処理) 4    : 5 result = SampleDto() 6 result.data1 = "テスト" 7 result.data2 = 999 8

get で、上記のようにdto に値をセットします。このdto の内容を、JSONで返すのがおおまかな処理です。
最初は、

python

1 return jsonify(result)

とやったのですが、SampleDto がJSON に変換できないとエラーになりました。
次に、

python

1class SampleDtoJSONEncoder(json.JSONEncoder): 2 def default(self, obj): 3 if isinstance(obj, SampleDto): 4 return {'data1': obj.data1, 'data2': obj.data2, 'errorMessage': obj.errorMessage} 5 return json.JSONEncoder.default(self, obj)

とEncoder を追加し、

python

1 return jsonify(result, cls=SampleDtoJSONEncoder, ensure_ascii=False)

とやってみましたが、やはりエラー。

python

1 jsonText = json.dumps(result, cls=SampleDtoJSONEncoder, ensure_ascii=False) 2 return jsonText

とすると、エラーは出なくなりましたが、

JSON

1"{\"data1\": \"\u30c6\u30b9\u30c8\", \"data2\": 999, \"errorMessage\": null}"

と、バックスラッシュが入る上に、文字化けしてしまいます。

python

1 return jsonify(jsonText)

とすると、

JSON

1"{\"data1\": \"テスト\", \"data2\": 999, \"errorMessage\": null}"

と文字化けは直るのですが、バックスラッシュは消えません。
ちなみに、クラスではなく、普通にdict に入れて変換すると、

python

1 result = {'data1':'テスト', 'data2': 999, 'errorMessage': None} 2 return jsonify(result)

JSON

1{"data1":"テスト","data2":999,"errorMessage":null}

と、意図した結果が得られます。

自作クラスをJSON に変換し、なおかつ文字化けや、不要なバックスラッシュが入らないようにするには、どうしたらいいんでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

特に再現はしないので、

jsonText = json.dumps(result, cls=SampleDtoJSONEncoder, ensure_ascii=False)
return jsonText

とすると、エラーは出なくなりましたが、
"{"data1": "\u30c6\u30b9\u30c8", "data2": 999, "errorMessage": null}"

と、バックスラッシュが入る上に、

から考えるに、この時点(json.dumpsにresultを渡している時点)で、resultがjson形式のstrになってしまっているのだと思います。
デバッグとしてtype関数の結果を見るのがいいのではないでしょうか。

投稿2018/09/21 13:13

quickquip

総合スコア11001

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tfline_w

2018/09/21 17:07

quiquiさん、ありがとうございます。 result はSampleDto 型だったのですが、仰るとおり、str になっているものをjsonify() に渡しているからだ、ということに気づき、jsonify() の中を追ってみると、受け取ったstr をさらに、json.dumps にかけていました。 いろいろ考えて、結局、 resp = make_response(json.dumps(result, cls=SampleDtoJSONEncoder, ensure_ascii=False), 200) return resp と変更したところ、意図した通りの結果を得ることができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.54%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。