なぜですかjson.loadsのみ許可object_hook
,parse_float
,およびparse_constant
?Python json.loadに配列フックとパースコールバックがありませんか?
json.loads(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
これらはすべて本質的にコールバックであり、その戻り値は解析中に使用されます。
私の意図は、これらのコールバックを使用して、コールバックパラメータを変更してJSON文字列の独自の表現を作成することでした。しかし、配列、文字列、ブール値のコールバックがなくても、かなり制限されているようです。 (1つのオブジェクトのみがあるので)_object_hookするだけで、単一の呼び出しで結果...
import json
def _object_hook(d):
print(d)
return d
json.loads('{"a": [1, [2, [3]]]}', object_hook=_object_hook)
:
は、この単純な例を見てみましょう。
>>> {u'a': [1, [2, [3]]]}
任意の深さ、ネストされた配列、配列を渡すのジョブを(再帰的に、またはおそらく幅優先/深さ優先トラバーサルを有する)のままで与えます。
続いて、文字列があまりにもいくつかの理由と例外のためのものです:
import json
def _object_hook(o):
print('_object_hook', o)
return o
def _parse_float(f):
print('_parse_float', f)
return f
def _parse_int(i):
print('_parse_int', i)
return i
def _parse_constant(c):
print('_parse_constant', c)
return c
json.loads('{"a": [1, [2, [3.1], ["4"]]]}',
object_hook=_object_hook,
parse_int=_parse_int,
parse_float=_parse_float,
parse_constant=_parse_constant)
...( "4" は、以下の結果に省略されている)文字列を処理する方法はありません。
('_parse_int', '1')
('_parse_int', '2')
('_parse_float', '3.1')
('_object_hook', {u'a': ['1', ['2', ['3.1'], [u'4']]]})
おそらく私の期待は間違っています。しかし、JSON文字列をPythonの辞書やリストに解析して、それを再度カスタム形式に解析するだけでは無駄に思えました。
json.loads
を使用して残して、結果のPython表現を自分のPythonクラスに解析すると、文字列、ブール値、ヌルなどの配列フックや解析コールバックがありません。
パフォーマンス。そしてフックは、JSONフォーマットの卸売替えを可能にするものではありません。 –