Python CPython 3.14.3 上でパーサーを実行して確認しました。
Extra data: line L column C (char N)
json.loadsは完結した値をひとつ読み終えたあと、さらに内容を見つけました。Pythonはそれをextra dataと呼びます。報告された行が2以降で、各行が完結したレコードに見えるなら、そのファイルはJSON Linesであり、1行ずつ読む必要があります。
JSONを貼り付けて、壊れている箇所を正確に確認する
入力
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
実際の原因
どれが答えになることが多いか、その順に並べています。
-
01 ファイルがJSON Lines
1行に1つのJSONオブジェクト、カンマなし、全体を包む配列なし。ログ、BigQueryのエクスポート、ストリーミングAPIの標準的な出力形式です。
壊れる例
with open('events.jsonl') as f: data = json.load(f) # Extra data: line 2 column 1動く例
with open('events.jsonl') as f: data = [json.loads(line) for line in f if line.strip()] # or, with pandas import pandas as pd df = pd.read_json('events.jsonl', lines=True) -
02 ループの中でjson.dumpsを呼び、同じファイルに追記した
呼び出しごとに完結したドキュメントが書かれるため、ファイルには複数のドキュメントが入ります。意図的にJSON Linesとして書き、そのように読むか、レコードをリストにためて一度だけdumpするかのどちらかにしてください。
壊れる例
for row in rows: f.write(json.dumps(row))動く例
for row in rows: f.write(json.dumps(row) + '\n') # NDJSON, read line by line # or f.write(json.dumps(rows)) # one array -
03 2つのレスポンスが連結された
バッファを置き換えずに追記してしまったリトライです。
ほかのランタイムでの同じ間違い
根本にある問題は同一で、違うのは文言だけです。同僚がこれらのどれかを報告してきたなら、見ているものはあなたと同じです。
| JavaScript (V8) | Unexpected non-whitespace character after JSON at position 8 (line 2 column 1) |
|---|
よくある質問
- 1つの文字列から複数のドキュメントを読むPythonの関数はありますか?
- json.JSONDecoder().raw_decode(s, idx) は値をひとつ解析し、どこで止まったかを返すので、ループさせられます。行区切りのファイルなら、改行で分割するほうが単純ではるかに高速です。
- charのオフセットが行・列と一致しないのはなぜですか?
- charは文字列内の絶対インデックスで、行と列は人間が読むための位置です。どちらも同じ地点を指しています。