Python で JSON をフラット化する

Ammar Ali 2023年6月21日
Python で JSON をフラット化する

このチュートリアルでは、Python で条件ステートメント、ループ、および type() 関数を使用して JSON をフラット化する方法について説明します。

Python で JSON をフラット化する

JSON はファイル形式であり、JavaScript Object Notation の略です。 JSON は、人間が読み取って理解できるデータを格納および送信します。

JSON ファイル内の配列またはリストで区切られた値を持つさまざまな属性が表示されます。 たとえば、JSON ファイルを使用して、名前、年齢、住所、クラスなどの生徒のデータを保存できます。

各生徒のデータは、さまざまなデータ型の属性と値を含む配列に格納されます。 たとえば、JSON ファイルの例を以下に示します。

{"Ali" : {
      "age": 18,
      "profession": "student"},
 "Ammar" : {
      "age" : "nineteen",
      "profession": "mechanic"}
 }

上記のファイルには 2 人の人物に関する情報が含まれており、Python の json ライブラリを使用して読み取ることができます。 たとえば、json ライブラリを使用して上記のファイルを読み取り、その内容を表示します。

以下のコードを参照してください。

import json

json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)

出力:

Original Data
 {'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}

ファイルを読み取るには、open() 関数でファイル名とその拡張子を指定する必要があります。ファイルが Python ファイルと同じディレクトリにない場合は、ファイルのフル パスとその拡張子を指定する必要があります。 open() 関数内の名前と拡張子。 json ライブラリの load() 関数を使用して、JSON データを読み取りました。

data['Ali'] のように data 変数内の名前を使用して、1 人の人のデータを取得できます。 大量のデータを含むマルチレベルの JSON ファイルがある場合、特定の属性の値を読み取ることが難しくなります。

マルチレベル JSON ファイル内には、リストや dicts などの他の属性内に属性があります。 マルチレベル JSON ファイルを単一レベルに変換する場合は、属性名を組み合わせることができます。

たとえば、上記のコードでは、Ali の年齢を取得したい場合、data['Ali']['age'] を使用してアクセスできますが、属性名を組み合わせると、 Ali の年齢を取得する data['Ali_age']

自分自身を複数回呼び出す再帰関数を使用して、JSON データを平坦化できます。 JSON ファイルからデータを読み取り、2つのループを使用してデータ内の listdict をチェックする必要があります。

ループを使用して属性の名前を区切り文字と組み合わせ、その値を dict 形式で保存します。 JSON ファイルにデータがなくなるとループが停止し、結果が返されます。

たとえば、上記の JSON ファイルをフラット化してみましょう。 以下のコードを参照してください。

import json

json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)


def flatten_json_data(json_data):
    out = {}

    def flatten_json(d, name=""):
        if type(d) is dict:
            for a in d:
                flatten_json(d[a], name + a + "_")
        elif type(d) is list:
            i = 0
            for a in d:
                flatten_json(a, name + str(i) + "_")
                i += 1
        else:
            out[name[:-1]] = d

    flatten_json(json_data)
    return out


flattened_data = flatten_json_data(data)
print("\nflatten Data\n", flattened_data)

出力:

Original Data
 {'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}

flatten Data
 {'Ali_age': 18, 'Ali_profession': 'student', 'Ammar_age': 'nineteen', 'Ammar_profession': 'mechanic'}

上記のコードでは、if-else 条件文を使用して入力データ型をチェックし、オブジェクトのデータ型を返す type() 関数を使用しています。 データの読み取り中に dict が来ると、最初のループが機能します。 リストが来ると、2 番目のループが機能します。

上記の出力では、元のデータには 2つの dicts が含まれていますが、平坦化されたデータには 1つの dict しか含まれていないことがわかります。 JSON ファイルの例にはリストが含まれていませんが、上記のコードはリストを含む JSON ファイルでも機能します。

元のデータと平坦化されたデータには違いがあります。 元のデータを使用して年齢と職業を同時に取得できます。これは、年齢と職業が同じ親属性 (人の名前) を持っているためですが、平坦化されたデータを使用して同じことを行うことはできません。

フラット化されたデータを使用して人の年齢と職業を取得するには、それらを 1つずつ個別に取得する必要があります。

フラット化された JSON ファイルは、単一の値のみを取得する必要がある場合に役立ちますが、オブジェクトまたは属性に関するすべての情報を取得する場合は、元の JSON ファイルを使用できます。 JSON ライブラリの詳細については、この リンク を確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Python JSON