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

json.loads解析路由器返回数据:离线正常在线报错求助

排查JSON解析失败的实用步骤

针对你遇到的问题——处理后的字符串手动粘贴可解析但直接调用json.loads报错,以下是具体排查方向:

  • 检查不可见控制字符:用repr(rx)打印字符串的原始表示,查看是否存在BOM(如\xef\xbb\xbf)、空字节\x00或其他非打印ASCII字符。这类字符在终端显示时会被过滤,但会导致json.loads无法识别有效JSON起始位置。
  • 验证编码与异常字符:执行print(rx.encode('utf-8', errors='backslashreplace')),将无法转码的字符转为转义序列,排查是否存在路由器返回的非UTF-8编码字符。
  • 清理前后冗余内容:路由器返回的字符串可能附带命令提示符(如router#)、全角空格\u00A0或软换行。可以用rx = rx.strip('\t\n\r\x00\u00A0')移除多类型空白,或用正则提取核心JSON:
    import re
    json_str = re.search(r'\{.*\}', rx, re.DOTALL).group()
    
  • 对比字符串一致性:计算处理后字符串与粘贴到Shell的字符串的哈希值,确认两者是否完全一致:
    import hashlib
    # 计算原处理后字符串的哈希
    print(hashlib.md5(rx.encode()).hexdigest())
    # 手动粘贴后赋值给s,计算哈希对比
    s = "粘贴的字符串内容"
    print(hashlib.md5(s.encode()).hexdigest())
    
    若哈希不同,逐字符对比差异:
    for idx, (a, b) in enumerate(zip(rx, s)):
        if a != b:
            print(f"位置{idx}: {repr(a)} vs {repr(b)}")
    
  • 检查处理逻辑漏洞:确认添加单引号包裹的操作是否引入语法错误,或换行/空字符替换是否彻底(比如是否遗漏了\r\n)。也可以将处理后的字符串写入二进制文件,用十六进制编辑器查看原始字节:
    with open('rx_raw.bin', 'wb') as f:
        f.write(rx.encode('utf-8'))
    
  • 直接提取JSON结构:跳过手动处理,尝试从原始响应中直接匹配JSON块,避免误处理导致的字符污染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:05:25