You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取截断JSON文件至Pandas DataFrame报错,寻求解决方法

问题描述

我有一个截断的JSON文件,尝试用Pandas的read_json方法读取到DataFrame时失败,代码如下:

import pandas as pd

df = pd.read_json("C:/Users/user1/Documents/history_truncated.json")
df.head()

运行后报错:

ValueError: Unexpected character found when decoding array value (2)

试过使用绝对路径的方案,但无效。以下是JSON文件的末尾几行内容:

"departurePlatformName":null,"departureBoardingActivity":0,"departureBoardingActivitySpecified":true,"departureStopAssignment":null,
"departureOperatorRefs":null,"aimedHeadwayInterval":null,"expectedHeadwayInterval":null,"distanceFromStop":null,"numberOfStopsAway":null,"extensions":null},{"stopPointRef":{"value":"SE:276:Quay:9022012013003041"},"visitNumber":"1","order":"7","stopPointName":null,"item":false,"itemElementName":0,"predictionInaccurateSpecified":false,"occupancySpecified":false,"timingPointSpecified":false,"boardingStretch":false,"requestStop":false,"originDisplay":null,"destinationDisplay":null,"callNote":null,"facilityConditionElement":null,"facilityChangeElement":null,"situationRef":null,"aimedArrivalTime":"2022-08-30T09:33:00+02:00","aimedArrivalTimeSpecified":true,"expectedArrivalTime":"2022-08-30T09:33:00+02:00","expectedArrivalTimeSpecified":true,"expectedArrivalPredictionQuality":null,"arrivalStatus":0,"arrivalStatusSpecified":true,"arrivalProximityText":null,"arrivalPlatformName":null,"arrivalBoardingActivity":0,"arrivalBoardingActivitySpecified":true,"arrivalStopAssignment":null,"arrivalOperatorRefs":null,"aimedDepartureTimeSpecified":false,"expectedDepartureTimeSpecified":false,"provisionalExpectedDepartureTimeSpecified":false,"earliestExpectedDepartureTimeSpecified":false,"expectedDeparturePredictionQuality":null,"aimedLatestPassengerAccessTimeSpecified":false,"expectedLatestPassengerAccessTimeSpecified":false,"departureStatus":0,"departureStatusSpecified":true,"departureProximityText":null,"departurePlatformName":null,"departureBoardingActivity":0,
"departureBoardingActivitySpecified":true,
"departureStopAssignment":null,
"departureOperatorRefs":null,"aimedHeadwayInterval":null,
"expectedHeadwayInterval":null,"distanceFromStop":null,
"numberOfStopsAway":null,"extensions":null}],"isCompleteStopSequence":true,
"extensions":null}
}]
}]]}
}
可行解决建议

1. 手动修复JSON语法错误

从提供的末尾内容看,JSON存在结构截断问题(嵌套的{}/[]未正确闭合)。可以:

  • 用支持JSON校验的编辑器(比如VS Code)打开文件,编辑器会高亮语法错误位置,手动补全缺失的闭合括号或引号。
  • 统计文件中{和}、[和]的数量差值,对应补全缺失的闭合符号。

2. 用代码自动尝试修复并读取

通过代码统计括号数量,补全缺失的闭合符号后再解析:

import json
import pandas as pd

def fix_and_load_json(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 统计开闭括号数量,补全缺失的闭合符号
    open_braces = content.count('{')
    close_braces = content.count('}')
    open_brackets = content.count('[')
    close_brackets = content.count(']')
    
    content += '}' * (open_braces - close_braces)
    content += ']' * (open_brackets - close_brackets)
    
    try:
        data = json.loads(content)
        # 根据JSON结构调整DataFrame的生成方式,比如嵌套结构可能需要用json_normalize
        return pd.json_normalize(data)
    except json.JSONDecodeError as e:
        print(f"修复后仍有语法错误: {e}")
        return None

df = fix_and_load_json("C:/Users/user1/Documents/history_truncated.json")
if df is not None:
    print(df.head())

3. 尝试分块读取解析

如果文件过大,截断位置不明确,可以逐行拼接内容,找到能正常解析的最大有效部分:

import json
import pandas as pd

file_path = "C:/Users/user1/Documents/history_truncated.json"
with open(file_path, 'r', encoding='utf-8') as f:
    lines = f.readlines()

# 从第一行开始逐步拼接,直到解析成功
for line_count in range(1, len(lines)+1):
    try:
        partial_content = ''.join(lines[:line_count])
        data = json.loads(partial_content)
        df = pd.json_normalize(data)
        print(f"成功解析前{line_count}行数据")
        print(df.head())
        break
    except json.JSONDecodeError:
        continue

4. 调整read_json参数尝试

如果JSON是行分隔格式(每行一个独立JSON对象),可以添加lines=True参数尝试读取:

df = pd.read_json("C:/Users/user1/Documents/history_truncated.json", lines=True)

内容的提问来源于stack exchange,提问作者OLGJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:20:26