PythonでJSONを読み込んでパース(変換)する方法【PHPとの比較】

PythonでJSONを読み込んでパース(変換)する方法【PHPとの比較】 プログラミング

PythonでJSONを扱う場合に、混乱しませんでしたか?
私は、混乱しました。

PHPがメイン言語であれば、同じように混乱すると思います。
Javaも仕事で使っていますが、混乱しました。

同じように混乱する人が減るように、PythonでのJSONの扱い方をまとめておきます。
というか、私自身のためでもありますけどね。

本記事の内容

  • PythonでJSONと言えば2つある
  • JSON文字列の辞書への変換
  • JSONファイルの辞書としての読み込み

それでは、上記に沿ってPythonでのJSONの取り扱いを解説していきます。

PythonでJSONと言えば2つある

PythonでJSONをパースする場合、2種類のJSONが存在します。
PHPでJSONと言えば、JSON文字列しか存在しません。

まず、PHPにおけるJSONから説明します。
おそらく、私の知る限りJavaもそうだと思います。

PHPにおけるJSON

PHPでJSONは、文字列のみです。(別途ライブラリなどの利用は対象外)
もちろん、「test.json」のようにjsonファイルは存在します。

しかし、PHPでJSONをパースする場合は、JSON文字列のみが対象です。
一般的なJSONのパースは、次のようなコードとなります。

<?php
    
    //jsonファイルのパス
    $file = "ip_list.json";
    //jsonファイルの読み込み
    $data = file_get_contents($file);
    //JSON文字列の配列へのパース
    $ary = json_decode($data, true);
    
?>

jsonファイルを読み込みます。
読み込んだ(JSON)文字列をjson_decodeにより配列へ変換します。

以上より、PHPでは必ずJSON文字列が存在することになります。
JSON文字列からのみ配列へ変換できると表現してもいいかもしれません。

これに対して、Pythonではもう一つ別の方法があるのです。

PythonにおけるJSON

2つのJSONとは、以下です。

  • JSON文字列
  • JSONファイル

Pythonでは、上記2つのJSONから辞書(PHPにおける配列)へ変換できるのです。
一度理解すれば、簡単です。

ただ、初めのほうは混乱します。
また、メソッドがほぼ一緒なので・・・

これらを以下で説明していきます。

JSON文字列の辞書への変換

これは、PHPと同じ考え方ですね。
JSON文字列から辞書へ変換します。

まずは、Pythonのプログラムコードから確認しましょう。

# jsonモジュールのインポート
import json

# jsonファイルのパス
file = "ip_list.json";
# jsonファイルの読み込み
with open(file) as f:
    data = f.read()
    # JSON文字列の辞書へのパース
    dict = json.loads(data)

ファイルを読み込みます。
読み込んだJSON文字列を辞書へパースします。

考え方はPHPと同じですよね。
PHP使いの人は、こちらの方が馴染み易いはず。

JSONファイルの辞書としての読み込み

次は、もう一つのJSONですね。
こちらは、JSONファイルから直接辞書へ変換します。
変換と言うより、辞書として読む込む形になります。

同じように、Pythonのプログラムコードから確認しましょう。

# jsonモジュールのインポート
import json

# jsonファイルのパス
file = "ip_list.json";
# jsonファイルの読み込み
with open(file) as f:
    # JSONファイルの辞書へのパース
    dict = json.load(f)

ファイルを読み込みます。
しかし、それを文字列にはしません。
そのままJSONファイルを辞書へ変換しています。

理解してしまえば、簡単です。
しかし、理解する前にはloadとloadsで違いがわかりませんでした。
「s」があるかないかだけで、これほど機能的に異なるのです。

冗談抜きで、初めは参考ページの誤記だとばかり思っていました。
Pythonを学び始めの人は、注意してください。

特に、PHPや他言語からPythonを学んでいる人は。
それらの言語における知識が偏見となり、理解を妨げることがあり得ます。

タイトルとURLをコピーしました