6
6

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.

ちゅらデータAdvent Calendar 2020

Day 11

PythonでJSONを編集するならこれを見てくれ

Last updated at Posted at 2020-12-11

この記事は ちゅらデータアドベントカレンダーの11日目の記事 になります。

TL;DR

  • JSONを辞書型から作る
    • 一番楽なので皆さんはこちらを使いましょう。
import json

json_dict = {
    "hoge": "hoge",
    "fuga": {"fuga": "piyo", "chura": data},
}

# dict → json
json_string = json.dumps(json_dict)

# json → dict
json_dict = json.loads(json_string)

  • トリプルクォーテーション(三連引用符)で編集する
    • (多分文字列でjson作ろうって思ってしまったんだろうなぁ(私))
import textwrap

json_text = f"""\
        {{
            "hoge": "hoge",
            "fuga": {{
                "fuga": "piyo", "chura": data
            }},
        }},
    """
geojson_text = textwrap.dedent(geojson_text)
  • 文字列をつなげて編集する
    • できる限り↑2つのどちらかを使いましょう。可読性が高いです。
json_text = "{'hoge': 'hoge', 'fuga': {'fuga': 'piyo', 'chura': " + data + "}}"

初めに

南の島でデータ分析している、いんてるです。

最近PythonでJSONを編集する機会があったのですが、JSONを編集する方法って必ずしも1つじゃないと思っていて、初心者から上級者まで幅広い書き方があると思うんですよ。アイディア次第では簡単な方法にたどりつかず回り道してしまうことだってあると思っています。そこで今回は3種類ほどJSONの書き方を示した上で、各書き方ごとのポイントを抑えて行こうかと思います。TL;DRに書いてありますが、この記事を読んだ皆さんはぜひ 辞書型 でJSONの中身を作って変換しましょうね!お兄さんとの約束ですよ!

JSONを辞書型から編集する

import json

json_dict = {
    "hoge": "hoge",
    "fuga": {"fuga": "piyo", "chura": data},
}

# dict → json
json_string = json.dumps(json_dict)

# json → dict
json_dict = json.loads(json_string)

これが1番良いです。何故良いのかというと、Pythonの持つ辞書型の書き方を踏襲しながら、標準ライブラリであるJSONを使ってJSON⇔Dictを変換しています。さらに書き方についてググるケースが少ない(おそらく調べてもjson.loadsとjson.dumps)くらいです。初心者にも優しいですね。

トリプルクォーテーション(三連引用符) で編集する

import textwrap

json_text = f"""\
        {{
            "hoge": "hoge",
            "fuga": {{
                "fuga": "piyo", "chura": data
            }},
        }},
    """
geojson_text = textwrap.dedent(geojson_text)

この書き方はおそらく頭の中で「JSON == Stringで編集だ!」みたいな脳になっているときにたどり着きそうですね。この書き方のポイントは3つあって

  • fstring を使って変数の値をJSONテキストに入れている
  • fstring を使っているので波括弧{}をテキストとして入れるために二重にしている( {{ とか }} とか)
  • textwrap ライブラリでコード内にインデントしていても書き出す時や変数から読み出すときに共通のインデントを削除しています。

です。なのでStringでも可読性高く書くことができます。が、しかし調べなきゃいけないことが多くて、あんまりおすすめはできないです。意地でも遠回りして達成感を味わいたい方にはおすすめです。

文字列をつなげて編集する

json_text = "{'hoge': 'hoge', 'fuga': {'fuga': 'piyo', 'chura': " + data + "}}"

できる限り避けたほうがよさそうな書き方ですが↑の例はちょっとわざと可読性低く書いてる感じがしますね。誰がこの記事書いたんでしょうか。

ポイントですが、

  • トリプルクォーテーションの書き方同様にfstringが使えます。(↑の書き方だと文字列同士の足し算がなくなる形になります)
  • シングル・ダブルクォーテーションを初めに使った方と逆で文字列内部のクォーテーションを記載することができます。

くらいでしょうか。どちらにしても改行のためにバックスラッシュ(\)入れたりするのは毎度面倒なので避けたいですね。短いJSON作るなら採用してもいいかなくらいです。それより辞書型から変換する方法をつk(テキストはここで終わっている)

まとめ

JSONを辞書型から作る記事は山程あると思うのですが、テキストから作る記事はなかなかなくて、どうして書こうと思ったかというと、同じように「文字列からJSON作ってくしかねぇなぁ」というエンジニアの皆さんに、時間を無駄にしてほしくないと思って書きました。おそらく文字列から作ろうとする人たちはググるときのキーワードで「python json string」とか調べて「俺はjsonの中身の作り方が知りたいんじゃ!」ってなってると思います。僕は二度と文字列で作らないです。

もしPythonでJSONを編集する方法でもっと可読性高くてスマートに書けるとか、俺ならこう書いたほうが後々便利だぜとか、あればぜひコメントでご指導ご鞭撻いただければと思います。

明日、12日目は @amacbee さんが ちゅらデータ設立において大事にしたこと です。私はこの考え方が好きで入社したと言っても過言ではないので、よければ。

参考記事

6
6
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
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?