You need to enable JavaScript to run this app. json.decoder.JSONDecodeError缺少:分隔符 加载JSON文本失败如何解决
优惠活动
大模型
产品
解决方案
定价
更多

json.decoder.JSONDecodeError缺少:分隔符 加载JSON文本失败如何解决

问题定位与修复方案

问题根因

这个JSON解析错误是读取到的JSON文件结构不完整导致的,常见原因如下:

  • 并发读写冲突:报错由定时任务触发,说明存在多个任务同时操作balance.txt的可能,前一次写入还未完成,后一次读取就已执行,读到的是截断的内容,刚好在57357字符位置缺少语法要求的冒号分隔符。
  • 编码不匹配:写入文件时未指定编码,Windows系统默认用GBK编码写入,若返回的JSON中存在非ASCII字符,会出现字符截断、乱码,破坏JSON结构。
  • 写入逻辑不合理:你提供的代码中读取逻辑嵌套在写入的with块内部,此时写入的内容还未完全flush到磁盘、文件也未正式关闭,直接读取可能拿到不完整的缓冲内容。
  • 写入过程异常中断:如果json.dump过程中程序异常退出,会导致文件只写入了部分内容,结构损坏。

验证方法

找到程序报错时对应的balance.txt文件,定位到第1行第57357字符的位置,查看该位置附近内容是否存在截断、乱码、缺失冒号的情况,即可确认是否为文件写入不完整导致的问题。

修复方案

1. 调整读写逻辑,统一指定UTF-8编码

balance = exchange.fetch_balance()
# 写入逻辑,指定UTF-8编码,关闭ensure_ascii避免非ASCII字符转义
with open('balance.txt', 'w', encoding='utf-8') as json_file:
    json.dump(balance, json_file, ensure_ascii=False)
print("Balance file created")

# 读取逻辑放到写入的with块外部,确保文件已关闭、内容完全写入磁盘
with open('balance.txt', 'r', encoding='utf-8') as json_file:
    data = json.load(json_file)
freeusdt = float(data['info']['balances'][11]['free'])
Qty = float(df['close'][last_row_index])
Qty = Qty + 300
buyqty = freeusdt / Qty

2. 避免并发读写

调整定时任务的执行间隔,保证单次任务执行完成后再触发下一次任务;也可以添加文件锁,确保同一时间只有一个操作读写balance.txt。

3. 添加异常兼容逻辑

读取JSON时增加异常捕获,遇到解析错误时,先重新从服务端拉取balance数据写入文件,再重试读取,避免单次写入失败导致程序崩溃:

import json
import time

def load_balance():
    max_retry = 3
    for _ in range(max_retry):
        try:
            with open('balance.txt', 'r', encoding='utf-8') as f:
                return json.load(f)
        except json.JSONDecodeError:
            # 解析失败重新拉取数据写入
            balance = exchange.fetch_balance()
            with open('balance.txt', 'w', encoding='utf-8') as f:
                json.dump(balance, f, ensure_ascii=False)
            time.sleep(0.1)
    raise Exception("读取balance文件失败,已重试%d次" % max_retry)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 01:36:08