Decode multiple JSON objects from one file
Python's json.loads
only decodes one JSON object. This example
shows how raw_decode
can be used to load multiple JSON values
from the same buffer.
I'm writing a program to load external Avro schemas from a
file, but the json.load
method raises a ValueError
if there's
any non-whitespace data after the first JSON object. Using this
procedure instead allows multiple schema declarations in the same
file to be processed successfully.
def iload_json(buff, decoder=None, _w=json.decoder.WHITESPACE.match):
"""Generate a sequence of top-level JSON values declared in the
buffer.
>>> list(iload_json('[1, 2] "a" { "c": 3 }'))
[[1, 2], u'a', {u'c': 3}]
"""
decoder = decoder or json._default_decoder
idx = _w(buff, 0).end()
end = len(buff)
try:
while idx != end:
(val, idx) = decoder.raw_decode(buff, idx=idx)
yield val
idx = _w(buff, idx).end()
except ValueError as exc:
raise ValueError('%s (%r at position %d).' % (exc, buff[idx:], idx))