はじめに
Herokuって便利ですよね。とりあえず動かすだけなら、初心者でもできますし。
そんなHerokuでDiscord botをHerokuで動かそうとしたときにハマったお話です。
問題点
Pythonのjson.loads()
はjson.dumps()
などで文字列化した辞書型 (連想配列) をもとの辞書型に直す関数です。
当然、返り値は辞書型です。
localやGCP上では問題なく使えていたのですが、herokuで同じように動かすと、なぜかstring型が返されていました。json.dumps()
を誤って使っていたというオチではありません。
Heroku
## 文字列をjson.loadsで解凍
loaded_dict = json.loads(dumped_string)
## printしてもそれっぽい出力
print(loaded_dict)
# {"key1":"value1", "key2":{"v2k1":"v2v1"}}
## しかし、stringになっている
print(loaded_dict["key1"])
# TypeError: string indices must be integers
for k, v in loaded_dict.items():
...
# AttributeError: 'str' object has no attribute 'items'
print(type(loaded_dict["key1"]))
# <class 'str'>
解決方法
Herokuの検索妨害力が強すぎて「Heroku使ってみた」みたいな記事ばかりヒットして、うまく根本的な問題原因が見つけられませんでした。
しかしprint(loaded_dict)
の表示自体はおかしくなかったので、eval()
で解決させました。
Heroku
## evalをかませる
loaded_dict = eval(json.loads(dumped_string))
## 解決!
print(loaded_dict["key1"])
# "value1"