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

Excel VBA提交含空字段JSON至Flask后端解析失败求助

问题:Excel VBA提交的非标准JSON在Flask后端解析失败

问题场景

从Excel通过VBA向Python Flask后端提交数据时,VBA生成的JSON存在不符合标准的空字段(表现为连续逗号,,),导致Flask无法正常解析JSON。

VBA生成的JSON示例

[
    [
        "name",
        "RTX",
        "SPX",
        "NDX"
    ],
    [
        "date",
        "close",
        "close",
        "close"
    ],
    [
        "2020-01-10T05:00:00.000Z", ,
        200.1,
        300.1
    ],
    [
        "2020-01-11T05:00:00.000Z",
        100.1,
        200.2,
        300.2
    ]
]

VBA发送请求代码

Set http = CreateObject("Msxml2.ServerXMLHTTP")
With http
    .Open "POST", url, False
    .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    .setRequestHeader "Content-Type", "application/json; charset=utf-8"
    .setTimeouts ONE_MIN_MS, 5 * ONE_MIN_MS, ONE_MIN_MS, 5 * ONE_MIN_MS
    .send to_json
    Log "response status: " & .Status
    resp = .responseText
End With

Flask接收代码及错误

执行data = req.get_json()时触发错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.11/site-packages/werkzeug/wrappers/request.py", line 620, in get_json
    rv = self.on_json_loading_failed(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/flask/wrappers.py", line 131, in on_json_loading_failed
    return super().on_json_loading_failed(e)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/werkzeug/wrappers/request.py", line 645, in on_json_loading_failed
    raise BadRequest(f"Failed to decode JSON object: {e}")
werkzeug.exceptions.BadRequest: 400 Bad Request: Failed to decode JSON object: Expecting value: line 1 column 90 (char 89)

调用req.get_data()获取的原始字节数据:

b'[["name","RTX","SPX","NDX"],["date","close","close","close"],["2020-01-10T05:00:00.000Z",,200.1,300.1],["2020-01-11T05:00:00.000Z",100.1,200.2,300.2]]'

解决方案

方案1:Python后端预处理修复非标准JSON

由于原始JSON中,,是不符合JSON规范的空值表示,可先将其替换为标准的null后再解析:

from flask import request, jsonify
import json

@app.route('/your-endpoint', methods=['POST'])
def handle_excel_data():
    # 获取原始数据并转为字符串
    raw_str = request.get_data().decode('utf-8')
    # 替换连续逗号为带null的格式
    fixed_str = raw_str.replace(',,', ',null,')
    try:
        # 解析修复后的JSON
        data = json.loads(fixed_str)
        # 后续业务逻辑处理
        return jsonify({"status": "success", "data": data})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 400

注意:该方案仅适用于空字段表现为连续逗号的场景,若存在其他非标准格式需调整替换规则。

方案2:VBA端生成标准JSON(推荐)

从根源解决问题,在VBA生成JSON时,将空单元格值替换为标准的null,避免生成,,:

' 示例:遍历单元格生成JSON元素时处理空值
Function GetJSONElement(cell As Range) As String
    If IsEmpty(cell.Value) Or cell.Value = "" Then
        GetJSONElement = "null"
    Else
        Select Case VarType(cell.Value)
            Case vbString
                ' 转义双引号(如果需要)
                GetJSONElement = """" & Replace(cell.Value, """", "\""") & """"
            Case vbDate
                ' 日期转为ISO格式字符串
                GetJSONElement = """" & Format(cell.Value, "yyyy-mm-ddThh:mm:ss.000Z") & """"
            Case vbInteger, vbLong, vbSingle, vbDouble
                GetJSONElement = CStr(cell.Value)
            Case Else
                GetJSONElement = "null"
        End Select
    End If
End Function

使用该函数生成每个单元格对应的JSON元素,再拼接成完整的JSON数组,确保输出符合JSON规范。

方案对比

  • Python端修复:快速临时解决,无需修改VBA代码,但依赖特定格式的错误,通用性弱。
  • VBA端修复:从源头保证JSON标准性,避免后续任何解析问题,是长期可靠的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:11:23