なぜ変換したいのか
JSONはキャメルケースで記述されることが多いです。Google JSON Style Guideでもそのように指定されています。一方でPythonの変数・関数名はスネークケースで記述されることが多いです。Pythonの標準ライブラリにおけるコーディング規約であるPEP8でもそのように定められています。
しかしながら、JSONは様々な言語で利用される形式であり、Pythonでも利用されています。そのため、JSONのプロパティ名をそのままPythonの変数名などとして利用できない不便さがあります。
キャメルケース、スネークケースとは
そもそもキャメルケース、スネークケースとは何でしょうか。下がその例になります。
キャメルケースの例 | camelCase, getUserAge |
---|---|
スネークケースの例 | snake_case, get_user_age |
キャメルケースというのは変数名などを複数の単語から名付ける際に各単語の先頭のみを大文字にする記法のことを指します。ここではローワーキャメルケースという特に名前の先頭の文字を小文字とする記法とします。
一方で、スネークケースでは各単語は小文字になっており、その間をアンダースコア「_」で区切る記法になっています。
pyhumpsによる相互変換
こういった変換は自分で実装してもよいですが今回はライブラリを使用します。pyhumpsではキャメルケースやスネークケースなどの間で相互に形式を変換できます。
文字列型はもちろん、辞書型のキーを一括で変換することも可能です。
今回はJSONに対して適用したいので辞書型で試してみます。なお、JSONをPythonで読み込む部分については割愛します。
pyhumpsではキャメルケースへの変換をhumps.camelizeという関数で以下のように実行できます。
import humps
snake_dict = {
"user_id": 3,
"eye_color": "brown",
"mother": {
"user_id": 1,
"eye_color": "green"
}
}
camel_dict = humps.camelize(snake_dict)
print(camel_dict)
# {'userId': 3, 'eyeColor': 'brown', 'mother': {'userId': 1, 'eyeColor': 'green'}}
以上のような形で再帰的にdict型のキーがキャメルケースに変換されています。
逆に、キャメルケースからスネークケースへの変換はhumps.decamelizeにより実行できます。今回はhumps.is_camelcaseを利用して対象がキャメルケースであることを確認してから変換してみます。
import humps
assert humps.is_camelcase(camel_dict) # キャメルケースであることの確認
new_snake_dict = humps.decamelize(camel_dict)
print(new_snake_dict)
# {'user_id': 3, 'eye_color': 'brown', 'mother': {'user_id': 1, 'eye_color': 'green'}}
以上のように、スネークケースで表される元の形のdictが出力されました。
おわりに
pyhumpsを利用することで簡単に変換ができました。これを利用したパイプラインを組み込むことでJSONの取り扱いがずっと簡素にできるのではないでしょうか。ライセンスやライブラリの依存も緩いのでぜひ使ってみてください。