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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

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

Q&A

解決済

2回答

4333閲覧

[python]json.dumpsで特殊文字が含まれる場合の対応方法

noz_awsinf_sp

総合スコア62

Python 3.x

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

0グッド

0クリップ

投稿2020/05/30 14:43

youtubeDataAPIの結果を下記のコードでファイルに保存しようとしています。
レスポンスのタイトルの中に「'」のような特殊文字がふくまれているケースがあり
これをデコード?した状態でjsonファイルに保存したいのですが、どのようにコードを修正すればよいかご教授ください。

(Vscodeのコンソールで$python youtube.pyのように下記のコードが含まれるスクリプトを打鍵すると
「'」がデコードされた状態で出力されるので、with openから下の部分でなにか修正なり追記が必要なのかと思いました。)

print(json.dumps(search_response, indent=4, ensure_ascii=False)) with open("./response.json", 'w', encoding='utf-8') as f: f.write(json.dumps(search_response, indent=4, ensure_ascii=False))

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

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

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

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

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

patapi

2020/05/30 16:29 編集

「(タイトルに)'のような特殊文字がふくまれているケース」に該当する具体的な動画IDを教えていただけないでしょうか。 また、「('を)デコード?した状態」で保存する、「'がデコードされた状態で出力される」とはどのような意味でしょうか。 (コマンドプロンプト等で表示させた際に文字化けしないような形に変換して保存するという意味でしょうか?)
guest

回答2

0

質問のコードが実行不能(*)なので修正コードは示せませんが、標準ライブラリのhtml.unescapeで解決可能と思います。
https://docs.python.org/ja/3/library/html.html#html.unescape

python

1import html 2print(html.unescape(''で括られてます''))

実行結果

plain

1'で括られてます'

(*)質問には

import json search_response = {'title': 'なんか'が入っています'} print(json.dumps(search_response, indent=4, ensure_ascii=False)) with open("./response.json", 'w', encoding='utf-8') as f: f.write(json.dumps(search_response, indent=4, ensure_ascii=False))

みたいに実行可能なコードを示すといいですよ。
それが問題の解決のためでもあります。

投稿2020/05/31 01:10

quickquip

総合スコア11055

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

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

0

ベストアンサー

結論から言うと

**後続処理の安全性を考えると、**そのまま保存するべきです。

&#39は文字参照といい、シングルクォート'を表しています。(文字参照って何?と思われる場合はご自分で調べてください)
なんで文字参照に変換されているのかというと、jsonデータ上でシングルクォートがデータとして入っていると文字列のくくりと区別がつかなくなり誤作動を起こすからです。
(例えば 'message' : 'Let's Go'なんてデータを作るとエラーになるのは自明ですね)

jsonデータとして使用しないテキストデータとして保存するのであれば文字参照を参照先の文字に変換して保存すればいいのですが、少なくとも後続処理でjsonとして使いたいのであればそのままにすべきです。

指摘を受けて追記

jsonではクォーテーションにダブルクォート以外の文字は受け付けない仕様であることを失念していました。jsonに限って言えばデータ中にシングルクォートが混じっていても全然問題ないです。
ただ、javascriptやpythonではデータのくくりは''でも""でも良いですし、youtube API側では生のシングルクォートがデータ中に入るのを避けているのではないかなと想像もできます。
また、別のシステムで当該のデータを使おうとするとき、エスケープ済み(文字参照が残っているデータ)のデータのほうがアンエスケープ(文字参照を実際の文字に戻した)したデータよりも安全に扱えます。アンエスケープは本当に必要な場面になって初めて行う方が安全と考えます。
以上のことにより、分かりやすくアカン例を使って「本当に変換が必要な場面まではそのままにしておくべき」とアドバイスしました。
'以外の文字参照が今後出てこないとも限りませんし。"来たら本当に壊れますし。

投稿2020/05/30 15:56

編集2020/05/31 02:57
hope_mucci

総合スコア4447

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

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

quickquip

2020/05/31 00:29

JSONの文字括りは " しか許さないのでそんなデータは作れない(それはJSONではない)です。"そのまま保存するべき"とはまったく思いませんが。 また " を含めたとしても、 json.dumps / json.loads がよしなにやってくれるので、その意味でも気にする必要を感じません。
hope_mucci

2020/05/31 03:00

加筆修正しました。jsonのクォート仕様に関しては私の認識ミスです。ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問