Pythonのjsonモジュールのdumpsパラメータの詳細説明

2023-07-08 15:42:53

Tailwindcss の使用を開始する Turbopack が Webpack より 700 倍高速な理由

目次

  1. JSONとは
  2. Python での JSON
    1. json.dump と json.dumps をシリアル化する
    2. json.load と json.loads を逆シリアル化する
    3. dumpsのパラメータ
      1. skipkeys
      2. sort_keys
      3. ensure_ascii
      4. allow_nan
      5. default
      6. indent
      7. separator
      8. check_circular
  3. 概要

1.JSONとは

Wikipedia からの定義: JSON (JavaScript Object Notation、JavaScript Object Notation) は、Douglas Crockford によって考案および設計された軽量のデータ交換言語であり、人間が読めるテキストに基づいており、属性値または属性値で構成されるデータ オブジェクトを送信するために使用されます。シリアル値。 JSON は JavaScript のサブセットですが、JSON は言語に依存しないテキスト形式であり、C ファミリの言語に似たいくつかのイディオムを採用しています。

データの例:


{
    "firstName": "Micheal",
    "lastName": "Jordan",
    "hobbies": ["running", "golfing", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Marcus",
            "age": 14
        },
        {
            "firstName": "Jeffrey",
            "age": 12
        }
    ]
}

JSON は、数値、文字列、ネストされたリストやオブジェクトなどのプリミティブ型をサポートします。

JSON をエンコードするプロセスは、シリアル化と呼ばれることがよくあります。 この用語は、ネットワーク上での保存または送信のために、 データ オブジェクトを一連のバイトに変換することを指します。

2. Python での JSON

2.1 json.dump と json.dumps をシリアル化する

  • dump はデータをファイルに書き込みます
  • dumps はデータ文字列、dump+str を生成します

コード例


In [1]: import json

In [2]: json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
Out[2]: '["foo", {"bar": ["baz", null, 1.0, 2]}]'

データをファイルに dump します

In [3]: with open('data.json', 'w')  as f:
   ...:     data = {'database': 'mongo'}
   ...:     json.dump(data, f)

データ {"database": "mongo"} は data.json ファイルに書き込まれます

2.2 json.load と json.loads を逆シリアル化する

  • load は、ファイル内の JSON データをオブジェクトとしてロードします
  • loads は、シリアル化された json 文字列を JSON オブジェクトとしてロードします

表からわかるように、逆シリアル化はシリアル化テーブルの完全な逆ではなく、逆シリアル化では tuple 型のデータを生成できません。

In [4]: data = ('amigo', 'branda', 'ariza')
In [5]: json.loads(json.dumps(data))
Out[5]: ['amigo', 'branda', 'ariza']

2.3 dumpsのパラメータ

dumps 関数は、シリアル化プロセス中の動作を制御するいくつかのパラメーターを提供します。

パラメータ 説明 デフォルト値
skipkeys JSONでシリアル化できないkeyをスキップするかどうか(str、int、float、bool、None を含む) False
sort_keys keyに従ってデータをソートするかどうか False
ensure_ascii 出力では、入力されたすべての非 ASCII 文字がエスケープされることが保証されます True
allow_nan JSON 仕様外の float データを許可するかどうか(nan, inf, -inf) True
default value をシリアル化できない場合に呼び出される関数です None
indent シリアル化後のインデントを表す正の整数です。 None
separator (item_separator, key_separator) 形式のタプルで、デフォルト値は (', ', ': ') None
check_circular 循環参照をチェックするかどうか True

以下では、いくつかのデータ例を使用して順番に説明します。

2.3.1 skipkeys

In [1]: import json

In [2]: def func():
   ...:     print('fun')

In [3]: data = {func: 'value', 'key': 'data'}

In [4]: json.dumps(data)
---------------------------------------------------------------------------
TypeError: keys must be str, int, float, bool or None, not function

In [5]: json.dumps(data, skipkeys=True)
Out[5]: '{"key": "data"}'

辞書データ data のキーの 1 つは関数 func であり、JSON で直接シリアル化できないため、これに対して json.dumps を実行すると、TypeError、 skipkeysTrue に設定し、シリアル化中にキー値 func をスキップします。シリアル化は成功します。

2.3.2 sort_keys

In [6]: data = {'c': 3, 'b': 2, 'a': 1}

In [7]: json.dumps(data)
Out[7]: '{"c": 3, "b": 2, "a": 1}'

In [8]: json.dumps(data, sort_keys=True)
Out[8]: '{"a": 1, "b": 2, "c": 3}'

sort_keys=True を指定すると、シリアル化されたデータはキー値 [a, b, c] に従ってソートされます

2.3.3 ensure_ascii

In [13]: data = {'first': '大牛', 'second': '二狗', 'third': '猫蛋'}

In [14]: json.dumps(data)
Out[14]: '{"first": "\\u5927\\u725b", "second": "\\u4e8c\\u72d7", "third": "\\u732b\\u86cb"}'

In [15]: json.dumps(data, ensure_ascii=False)
Out[15]: '{"first": "大牛", "second": "二狗", "third": "猫蛋"}'

dunps の場合、ensure_ascii=False が指定されるため、シリアル化されたデータは ascii トランスコーディングの使用を強制されず、出力は中国語になります

2.3.4 allow_nan

In [9]: data = {'float': 1.2, 'nan': float('nan'), 'inf': float('inf')}
In [10]: data
Out[10]: {'float': 1.2, 'nan': nan, 'inf': inf}

In [11]: json.dumps(data)
Out[11]: '{"float": 1.2, "nan": NaN, "inf": Infinity}'

In [12]: json.dumps(data, allow_nan=False)
ValueError: Out of range float values are not JSON compliant

allow_nan=False を指定した後、シリアル化されたオブジェクトに含まれる float データが範囲を超え、ValueError が報告されます。

2.3.5 default

In [1]: from datetime import datetime
In [2]: import json

In [3]: data = {'date': datetime.now()}
In [3]: json.dumps(data)
TypeError: Object of type datetime is not JSON serializable

In [4]: json.dumps(data, default=lambda x: x.strftime('%Y/%m/%d %H:%M'))
Out[4]: '{"date": "2021/08/13 11:03"}'

データ data には、シリアル化できないオブジェクトが含まれています。date フィールドは、datetime.datetime 形式のデータです。json.dumps を直接呼び出して、TypeError、 default 関数を指定した後、date のフィールドに関数を適用して文字列形式に変換すると、シリアル化が成功します。

2.3.6 indent

In [5]: data = {'lgd': {'players': ['ame', 'nothingtosay', 'faith_bian', 'xinQ', 'y`'], 'coach': 'xiao8'}, 'VG': {'players': ['poyoyo', 'ori', 'old_eleven', 'pyw', 'dy']}}

In [6]: print(json.dumps(data))
{"lgd": {"players": ["ame", "nothingtosay", "faith_bian", "xinQ", "y`"], "coach": "xiao8"}, "VG": {"players": ["poyoyo", "ori", "old_eleven", "pyw", "dy"]}}

In [7]: print(json.dumps(data, indent=4))
{
    "lgd": {
        "players": [
            "ame",
            "nothingtosay",
            "faith_bian",
            "xinQ",
            "y`"
        ],
        "coach": "xiao8"
    },
    "VG": {
        "players": [
            "poyoyo",
            "ori",
            "old_eleven",
            "pyw",
            "dy"
        ]
    }
}

dumps の場合、indent=4 を設定し、データに改行文字を追加し、データ レベルを 4 つのスペースでインデントします。

2.3.7 separator

In [8]: data
Out[8]: {'key': 'value', 'border': 'lands'}

In [9]: json.dumps(data)
Out[9]: '{"key": "value", "border": "lands"}'

In [10]: json.dumps(data, separators=(',', ':'))
Out[10]: '{"key":"value","border":"lands"}'

In [11]: json.dumps(data, separators=('&', '@'))
Out[11]: '{"key"@"value"&"border"@"lands"}'

デフォルトのデータ区切り文字は、'、'、および ': ' です。 separators=(',', ':') を指定してスペースを削除した後を使用すると、シリアル化されたデータをよりコンパクトにできます。コネクタをカスタマイズして、カスタム データ スタイルにダンプすることもできます。

2.3.8 check_circular

In [21]: data = {'key': 'value', 'border': 'lands'}
In [22]: data['data'] = data
In [23]: data
Out[23]: {'key': 'value', 'border': 'lands', 'data': {...}}

In [24]: json.dumps(data)
---------------------------------------------------------------------------
ValueError: Circular reference detected

In [25]: json.dumps(data, check_circular=False)
---------------------------------------------------------------------------
RecursionError: maximum recursion depth exceeded while encoding a JSON object

データ内にそれ自体への再帰参照がある場合、json.dumps は ValueError を報告します。check_circular=False を指定した後は、循環参照チェックは行われません。

概要:

この記事では、Python 組み込みモジュール json のダンプとロードの一般的なメソッドをまとめています

シリアル化プロセスにおけるパラメータ制御の概要:

① シリアル化できないデータ、キースキップ、関数変換を使用した値

② データのソート、エンコード、不正な float データ

③ インデントと区切り文字