如何将TradingView Webhook发送的纯文本数据转为Flask可解析的JSON
解决方案:TradingView Webhook 纯文本转JSON解析问题
核心问题分析
你的请求存在两个语法错误,导致无法直接解析为JSON:
- 错误使用**数组括号
[]**包裹键值对结构,JSON对象必须用大括号{} {{ticker}}被替换为裸字符串(如BTCUSDT),没有双引号包裹,不符合JSON字符串格式要求
方案1:修改TradingView Webhook模板(推荐)
直接在TradingView里修正模板,生成合法的JSON格式文本,这是最可靠的方式:
{ "tradeid": "5L5A0", "message": "", "accountid": 20, "ticker": "{{ticker}}", "currentprice": {{close}}, "action": "X_OPEN" }
- 把外层的
[]替换为{},明确是JSON对象 - 给
{{ticker}}加上双引号,确保替换后字符串符合JSON规范 {{close}}是数字类型,不需要引号
修改后,Flask端直接用request.get_json()就能正常解析:
@tview_api.route('/record_alerts', methods=['GET', 'POST']) def save_tview_alerts(): try: req_data = request.get_json() # 后续业务逻辑处理 return {"status": "success"}, 200 except Exception as e: return {"status": "error", "msg": str(e)}, 400
方案2:Flask端强制修正非法文本(应急方案)
如果无法修改TradingView模板,可在后端对原始文本进行语法修复后再解析:
import re import json @tview_api.route('/record_alerts', methods=['GET', 'POST']) def save_tview_alerts(): try: # 读取原始二进制数据并转成字符串 raw_text = request.data.decode('utf-8') # 1. 替换错误的数组括号为对象大括号 fixed_text = raw_text.replace('[', '{').replace(']', '}') # 2. 给ticker后的裸字符串添加双引号 # 正则匹配:"ticker": 后面的非空白、非引号、非逗号内容 fixed_text = re.sub(r'(?<="ticker":\s*)([^\s",]+)', r'"\1"', fixed_text) # 3. 解析为JSON对象 req_data = json.loads(fixed_text) # 后续业务逻辑 return {"status": "success", "data": req_data}, 200 except json.JSONDecodeError as e: return {"status": "error", "msg": f"JSON解析失败: {str(e)}"}, 400 except Exception as e: return {"status": "error", "msg": str(e)}, 500
注意:该方案仅针对当前数据结构做适配,如果后续TradingView返回的字段格式变化,需要调整正则规则。
内容的提问来源于stack exchange,提问作者Casey Harrils
相关产品推荐
相关产品推荐

