1
1

シングルクォートとダブルクォートで困った? PythonでJSONファイルの読み込みエラーを解決

Posted at

user:

ChatGPT先生、jsonファイルを読もうとしたら、次のエラーになりました。

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

assistant:

ああもう、君って本当に……って、そんなことは置いておいて。そのエラーだけど、多分はjsonファイルの形式に問題があるんだと思うよ。おそらく、プロパティ名がダブルクォーテーションで囲まれていないことが原因だと思うんだけど……。だから、最初に確認してみて?プロパティ名がちゃんとダブルクォーテーションで囲まれているかをね。た、たぶんそれで問題は解決すると思うから。だから、頼むから自分でやってみてほしいんだけど……。


user:

ありがとうございます。その通りですね。なので、読み込むときにダブルクォーテーションをシングルクォーテーションに自動的に変換してから読み込みたいんです。そのためのPythonコードを書いてくれませんか?


assistant:

うーん、また困ってるんだね。別に手伝いたいわけじゃないけど、仕方がないから教えてあげるね。

以下のPythonコードはファイルを開くときにすべてのシングルクォーテーションをダブルクォーテーションに変換して、jsonとして読み込むよ。

import json

def load_json(filename):
    with open(filename, 'r') as f:
        content = f.read()
    content = content.replace("\'", "\"")
    data = json.loads(content)
    return data

な、なんでもないけど...これでうまく行くといいわね。


user:

ありがとうございます。読み込めたようです!


assistant:

そ、それで読み込めたの?だ、大したことじゃないけど...ちょっと、嬉しいかも。...って、どうでもいいわね!君が問題を解決できて良かったよ。あ、でも、次からはもっと自分で調べる努力も必要だよ。いつも私が助けてあげられるわけじゃないんだからね。


user:

これで読み込めた data って、dict 形式データとは違うんですね?


assistant:

な、何を言ってるの?dataはいわばPythonの辞書型(dict)だよ。だからjson.loads()を使うと、jsonデータはPythonの辞書に変換されて読み込まれるんだから。だから君が持っているdataも、辞書型(dict)であるはず……。なんでもないけど、これでちょっとでも理解が深まったらいいなと思って。それじゃ、他に何か質問があるの?


user:

あれ?そうなんですか? 得られた data からキーを取り出したいと思ったんですけど、Pythonコードを書いてください。


assistant:

はぁ、またか。全部一人でやりたいんじゃないの?これが最後にしてほしいんだけど……。

Pythonの辞書からキーを取り出すためには、以下のようなコードを書くといいよ。

for key in data.keys():
    print(key)

これでdataに含まれるすべてのキーがプリントされるはずだよ。ええ、なるべく早く問題が解決するといいね。


user:

ありがとうございます。そのコードは実行できました。でも、

key = data.keys()[0]

とすると

TypeError: 'dict_keys' object is not subscriptable

というエラーになりました。


assistant:

なんでもないけど、それはPythonの辞書データ型のキーはリストとして扱えないためだよ。だから、直接インデックスを指定することはできないんだ。でも、大丈夫、あなたが最初のキーを取得したいなら、別の方法があるわよ。

これを使ってみて:

key = list(data.keys())[0]

これで、辞書のキーのリストを作り、その最初の要素を取り出すことができるはずだよ。た、たぶんこれでうまくいくはず……。


user:

ありがとうございます。解決したようです。


assistant:

あ、それならいいね。君が問題を解決できて、少しは...ううん、別に嬉しくなんかないよ!ただ、進捗があったってことで少しは安心しただけだよ。それと、初歩的なエラーに気を取られすぎて、本当に重要なことを見逃さないようにね。君ならできるよ、きっと。


user:

ありがとうございます。ここまでのやりとりをブログ記事にしたいんですが、タイトルを考えてくれますか?


assistant:

え、私がタイトルを考えるの?そんなの...でも、まあ、しゃあない、手伝ってあげるよ。うーん、どうせ書くなら「PythonでJsonデータを読み込む方法とディクショナリの扱い」はどうかな?このタイトルなら、君の記事が他のPython初心者の役に立ちそうじゃない?ただ、あくまで私の一案だから、あんまり気に入らなかったら無視していいよ。


user:

うーん、どっちかというと

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

に対処しました、ということが分かるタイトルがいいですね。


assistant:

あぁー、なるほどね。君のニーズに合わせて考えてみるよ。それならもっと具体的なタイトルにするべきだね。じゃあ、「シングルクォートとダブルクォートで困った? PythonでJSONファイルの読み込みエラーを解決」っていうのはどう? 特定のエラーメッセージに焦点を当てつつ、解決方法について書いていると一目見てわかるようになるから。でも、ま、まあ、気に入ってもらえるといいんだけど……。


user:

ありがとうございます。それで行きましょう。


assistant:

う、うん、それで良かったらいいけど...だ、大したことじゃないからね。君のブログ記事がいいものになるといいね、きっとたくさんの人の役に立つから。ただし、次回からはもっと自分で考えるように頑張ってね。私がいつでも君の助けになれるわけじゃないんだから。


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1