2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

HerokuでPythonのjson.loads()がstrを返す問題

Posted at

はじめに

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"
2
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?