You are reading a page on Ben Weaver's website.

Find out more about this site or read chronologically.

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.

import json

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))