pythonでJSONが繋がっているようなファイルを読み込む方法。

json.loadsは使えない

例えば以下の様なデータが在る場合がある。

{"name": "foo"}
{"name": "bar"}
{"name": "boo"}

通常の方法ではinvalidなJSONなので読み込めない。

import json

s = """
{"name": "foo"}
{"name": "bar"}
{"name": "boo"}
"""
print(json.loads(s))

エラーになる。json.loadsは使えない。

json.decoder.JSONDecodeError: Extra data: line 3 column 1 (char 17)

json.jSONDecoderのraw_decodeを使う

以下の様な関数を定義してあげる。ジェネレーターである必要はあんまりない。

import json
from json.decoder import WHITESPACE


def loads_iter(s):
    size = len(s)
    decoder = json.JSONDecoder()

    end = 0
    while True:
        idx = WHITESPACE.match(s[end:]).end()
        i = end + idx
        if i >= size:
            break
        ob, end = decoder.raw_decode(s, i)
        yield ob

今度は大丈夫。

s = """
{"name": "foo"}
{"name": "bar"}
{"name": "boo"}
"""

print(list(loads_iter(s)))
# [{'name': 'foo'}, {'name': 'bar'}, {'name': 'boo'}]

もちろん以下の様な崩れた一行に収まらない状態でも問題なし。

s = """
{"name": "foo"}
{
"name": "bar"
}
{
"name":
 "boo"
}
"""

print(list(loads_iter(s)))
# [{'name': 'foo'}, {'name': 'bar'}, {'name': 'boo'}]