本文へスキップ
jsonbeautifiers
日本語
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 の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる

実際の原因

どれが答えになることが多いか、その順に並べています。

  1. 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)
  2. 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
  3. 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は文字列内の絶対インデックスで、行と列は人間が読むための位置です。どちらも同じ地点を指しています。

今すぐ直す

上のツールにペイロードを貼り付けるか、この用途のために作られたツールに直接進んでください。

JSON Linesを配列に変換する