2023-07-08 15:42:53
Tailwindcss の使用を開始する Turbopack が Webpack より 700 倍高速な理由目次
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 をエンコードするプロセスは、シリアル化と呼ばれることがよくあります。 この用語は、ネットワーク上での保存または送信のために、 データ オブジェクトを一連のバイトに変換することを指します。
コード例
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 ファイルに書き込まれます
表からわかるように、逆シリアル化はシリアル化テーブルの完全な逆ではなく、逆シリアル化では tuple 型のデータを生成できません。
In [4]: data = ('amigo', 'branda', 'ariza')
In [5]: json.loads(json.dumps(data))
Out[5]: ['amigo', 'branda', 'ariza']
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 |
以下では、いくつかのデータ例を使用して順番に説明します。
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、 skipkeys を True に設定し、シリアル化中にキー値 func をスキップします。シリアル化は成功します。
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] に従ってソートされます
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 トランスコーディングの使用を強制されず、出力は中国語になります
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 が報告されます。
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 のフィールドに関数を適用して文字列形式に変換すると、シリアル化が成功します。
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 つのスペースでインデントします。
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=(',', ':') を指定してスペースを削除した後を使用すると、シリアル化されたデータをよりコンパクトにできます。コネクタをカスタマイズして、カスタム データ スタイルにダンプすることもできます。
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 データ
③ インデントと区切り文字