Python 2.7以降object_pairs_hook
では、組み込みのjsonモジュールを使用して、デコードされたオブジェクトのタイプを変更できます。リストに対して同じことをする方法はありますか?
1つのオプションは、フックへの引数として取得したオブジェクトを調べて、それらを独自のリストタイプに置き換えることですが、他にもっと賢い方法はありますか?
リストで同様のことを行うには、JSONDecoder をサブクラス化する必要があります。以下は、 のように機能する簡単な例ですobject_pairs_hook
。これは、C 実装ではなく、文字列スキャンの純粋な Python 実装を使用します。
import json
class decoder(json.JSONDecoder):
def __init__(self, list_type=list, **kwargs):
json.JSONDecoder.__init__(self, **kwargs)
# Use the custom JSONArray
self.parse_array = self.JSONArray
# Use the python implemenation of the scanner
self.scan_once = json.scanner.py_make_scanner(self)
self.list_type=list_type
def JSONArray(self, s_and_end, scan_once, **kwargs):
values, end = json.decoder.JSONArray(s_and_end, scan_once, **kwargs)
return self.list_type(values), end
s = "[1, 2, 3, 4, 3, 2]"
print json.loads(s, cls=decoder) # [1, 2, 3, 4, 3, 2]
print json.loads(s, cls=decoder, list_type=list) # [1, 2, 3, 4, 3, 2]
print json.loads(s, cls=decoder, list_type=set) # set([1, 2, 3, 4])
print json.loads(s, cls=decoder, list_type=tuple) # set([1, 2, 3, 4, 3, 2])
ソース コードによると、それは不可能です。C レベル関数はlist
、コールバック/フックを使用せずに組み込み型を明示的にインスタンス化します。トランク内も同様。