見出し画像

pythonプログラム 初歩の初歩8/JSONの取り扱い

こんにちは、makokonです。今日の初歩の初歩はJSONデータの取扱です。
皆さんはJSONデータを使っていますか?実はmakokonは初めてJSONファイルを見たときには、pythonプログラマーでなく、WEBもあまり興味がなかったので、JavaScriptを使うこともなく、なんでこんな面倒な形式をわざわざ使うのかわかりませんでした。絶対、配列とかCSVテキストのほうが、便利だと思いました。
でも、pythonを使うようになって、辞書形式のデータを扱うようになったときに、やっと価値がわかったので、その端緒を共有したいともいます。


JSONとは

JSON (JavaScript Object Notation) は、データ交換のフォーマットとして広く使用されるようになった軽量なテキストベースの構造です。その簡単な起源と提案された背景についてお話しします。

JSONの提案背景

  • JSONは、Douglas Crockfordによって初めて提案されました。
    彼はJavaScriptのプログラマで、JSONを広めた一人だが、「自分はJSONと名付けたが、考案者ではなく、それ自体は“自然に”存在していたものです」といったように述べているようです。

  • 当時の主なデータ交換フォーマットはXMLでしたが、その複雑さと冗長さから、よりシンプルで効率的な代替手段が求められていました。


提案された理由

  1. 軽量性: JSONはテキストベースで、シンプルな構造を持っています。これにより、データの送受信が迅速に行えます。

  2. 可読性: 人間にも機械にも読みやすく、デバッグやデータの確認が容易です。

  3. JavaScriptとの相性: JavaScriptのオブジェクトリテラル記法と非常に似ており、JavaScriptのコード内で直接使用できるため、Web開発において非常に便利です。


普及

  • JSONは、そのシンプルさと効率性から急速に普及しました。

  • 今日では、Web APIや設定ファイルなど、多くの場面で標準的なデータ交換フォーマットとして採用されています。

  • 多くのプログラミング言語がJSONをネイティブにサポートしており、言語やプラットフォームを超えたデータ交換を容易にしています。


pythonでのJSONの利用

JSONで表現するデータ型は以下のようなものが利用可能で、これらを組み合わせて表現します。特に、オブジェクト型がpythonの辞書と相性が良く(というよりそのまま)なので、とても使いやすくなっています。
JSONは軽量なテキストフォーマットです。JSONは人間にも機械にも読みやすく、Pythonの辞書型データと相互に変換が可能です。

  • オブジェクト(順序づけされていないキーと値のペアの集まり。)

  • 配列(データのシーケンス)

  • 数値(整数、浮動小数点数)

  • 文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーション"でくくった文字列)

  • 真偽値(true と false)

  • null


pythonでJSONを使用する4つの基本方法

PythonでJSONを扱うには、標準ライブラリのjsonモジュールを使用します。主に知っておくべき機能は次の4つです。

  1. JSON文字列からPythonオブジェクトへの変換(デシリアライズ)

  2. PythonオブジェクトからJSON文字列への変換(シリアライズ)

  3. ファイルにJSONデータを書き込み

  4. ファイルからJSONデータを読み込み


サンプルコード 

早速ですが、基本の4操作を含むサンプルコードを示します。
パイソンの辞書オブジェクト
{"name": "John", "age": 30, "city": "New York"}
を使って、操作を試します。 lesson8.py

import json

# PythonオブジェクトをJSON文字列に変換
python_obj = {"name": "John", "age": 30, "city": "New York"}
print("最初の pyton_obj :")
print(python_obj)

json_str = json.dumps(python_obj)
print("変換:python_obj => json_str : ")
print(json_str)

# JSON文字列をPythonオブジェクトに変換
json_str = '{"name": "John", "age": 30, "city": "New York"}'
print("最初の json_str : ")
print(json_str)

python_obj = json.loads(json_str)
print("変換:json_str => python_obj =>  : ")

print(python_obj)

# ファイルにPythonオブジェクトをJSONとして書き込む
print("data.jsonにpython_objを書き込む")
with open('data.json', 'w') as json_file:
    json.dump(python_obj, json_file)

# ファイルからJSONデータを読み込み、Pythonオブジェクトに変換
print("data.jsonからpython_objを読み出す")
with open('data.json', 'r') as json_file:
    python_obj = json.load(json_file)
    print("python_obj : ")
    print(python_obj)
    
 
print("type check")    
print(f"python_obj type = {type(python_obj)}")
print(f"json_str type = {type(json_str)}")

$ python lesson8.py
最初の pyton_obj :
{'name': 'John', 'age': 30, 'city': 'New York'}
変換:python_obj => json_str :
{"name": "John", "age": 30, "city": "New York"}
最初の json_str :
{"name": "John", "age": 30, "city": "New York"}
変換:json_str => python_obj => :
{'name': 'John', 'age': 30, 'city': 'New York'}
data.jsonにpython_objを書き込む
data.jsonからpython_objを読み出す
python_obj :
{'name': 'John', 'age': 30, 'city': 'New York'}
type check
python_obj type = <class 'dict'>
json_str type = <class 'str'>

実行結果 lesson8.py

特に説明することもないようなものですが、改めて方法を示します。
JSON文字列からPythonオブジェクトへの変換
    json.loads(json_str)
PythonオブジェクトからJSON文字列への変換
    json.dumps(python_obj)

ファイルにJSONデータを書き込み
    json.dump(python_obj, json_file)

ファイルからJSONデータを読み込み
    json.load(json_file)

また、プログラムの最後にデータ型のチェックをしています。
python_objは辞書型、json_strは文字列型です。
そして、その見た目は、今確認できたように殆ど変わりません。
ダブルコーテーションとシングルコーテーションの使い方に変化があるくらいです。
つまり、フィルに書き出したJSON形式は、そのままエディターや別のアプリでpythonでの認識通り見やすく利用することができます。

JSON形式とCSV形式の比較

プログラム上のデータをファイルに保存する形式のもう一つの筆頭はなんといってもCSVテキストファイルでしょう。(意義は認める)
何と言っても、CSVファイルはエクセルでそのまま読めるので圧倒的にデータ管理がしやすいです。
JSONとCSVこの2つの形式の比較を行いましょう。

JSONを使用する理由は複数ありますが、主にデータ構造の複雑さと柔軟性、可読性、言語間の互換性の観点から選ばれます。CSVやテキストファイルもデータの保存や交換に用いられることがありますが、それぞれ利点と欠点があります。以下で、JSONを使う理由について解説していきます。

JSONの利点

  1. 階層構造のサポート:
    JSONは、ネストされた構造を持つデータを扱うのに適しています。例えば、オブジェクト内に他のオブジェクトや配列を含むことができます。対照的に、CSVは平面的なデータ構造しか扱うことができません。複雑な階層や関連を持つデータの場合、JSONフォーマットの方が適切です。

  2. キーと値のペア:
    JSONデータはキーと値のペアで構成されているため、各データの意味(キー)がファイル内に明示されます。これにより、データの内容を理解しやすくなります。CSVでは、列の意味を覚えておく必要があり、場合によっては別途ドキュメントが必要になることもあります。

  3. 言語間の互換性:
    JSONはJavaScript Object Notationの略で、もともとはJavaScriptでの使用を意図していましたが、現在では多くのプログラミング言語でサポートされています。これにより、異なる言語を使用するシステム間でのデータ交換が容易になります。

  4. 可読性:
    JSONはテキストベースのフォーマットであり、人間にも機械にも読みやすい形式です。データの構造が直感的にわかりやすく、開発者がデバッグやデータ確認を行う際に有利です。

CSVやテキストファイルの利点

  1. シンプルさ:
    CSVは非常にシンプルなフォーマットであり、平面的な表形式のデータには最適です。Excelなどの表計算ソフトウェアとの互換性も高く、非技術者にとっても扱いやすいという利点があります。

  2. サイズ:
    大量の単純なデータを扱う場合、CSVファイルの方がJSONファイルよりもファイルサイズを小さく保つことができる場合があります。

  3. 処理速度:
    データの構造が非常にシンプルな場合、CSVファイルの読み書きの方がJSONよりも高速になることがあります。

結論

データの構造、用途、目的に応じて最適なフォーマットを選択することが重要です。複雑な階層構造を持つデータや、異なるプログラミング言語間でのデータ交換が必要な場合はJSONが適しています。一方で、データが単純な表形式であり、特に人間による読み書きの利便性を重視する場合はCSVやテキストファイルが適しています。

JSONの高度な使い方

今回は説明しませんが、pythonとJSONにまつわる処理にはいかに示すような多くの有用な利用方法があります。また、機会があれば説明しますが、興味のある方は調べてみても良いかと思います。それぞれの有効な利用方法はケースによって異なりますので、こんなキーワードがあったなあと覚えておくと、「これ、できるかも」といざというとき思いつくかもしれませんよ。

  • カスタムオブジェクトのシリアライズ: カスタムクラスのインスタンスをJSONに変換する方法。

  • カスタムデコーダの使用: JSONを特定のPythonオブジェクトにデシリアライズするカスタム処理の定義。

  • 整形しての出力: JSON文字列を見やすく整形(インデントや改行を加える)して出力。

  • キーのソート: JSON文字列を出力する際に、キーをアルファベット順にソート。

  • 非ASCII文字のエスケープ: JSON出力時に非ASCII文字をエスケープするかどうかの制御。

  • 大きな数値の精度保持: Pythonの大きな数値をJSONに変換する際の精度保持。

  • ファイルへのストリーム書き込み: 大きなデータをファイルにストリームとして書き込む処理。

まとめ


今回はJSON形式のデータをpythonで扱う方法について説明しました。
JSONはpythonの辞書データと相互に変換が可能で、非常に扱いやすい形式です。
基本的な操作として、
- パイソンオブジェクトとJSON文字列の双方向変換
- パイソンオブジェクトのJSON形式ファイルへの読み書き
をサンプルコードとともに説明しました。
その他、JSONにまつわる高度な処理方法を列挙し、今後のテーマとしました。

JSONは、とても使いやすいばかりでなく、データの意味がテキスト中に書かれているので、あとで意味がわからなくなるということがありません。膨大なデータを高速で処理する必要が出てこない限り、JSONでの利用が便利だと思います。
皆さんも是非試してください。
では、今回はここまで

#python #json #csv #dictionary #json .load #json .loads #json .dump #json .dumps #プログラム #初歩の初歩

おまけ タイトル画の説明 by GPT-4-vison

この画像は、開かれたノートの両ページに描かれた異なる内容を示しています。左ページには「STYLE NOTE」というタイトルがあり、ジャンクなデータを意味するグラフィック(ゴミ、果物、お菓子などのイメージ)が描かれています。右ページには「CONVERSION」というタイトルがあり、Pythonコードの例が記載されています。このコードは、左ページの無秩序な情報を整理していることを示唆している。画像の中心には矢印があり、これは左側の情報が右側のコードに変換されるプロセスを象徴しています。ノートを持つ手と書いている手が見え、木製のテーブルの上にノートが置かれています。

いいなと思ったら応援しよう!