Python中如何用re.sub将HJSON无引号字符串转为合法JSON
正则修复无引号JSON值实现方案
针对hjson库在Heroku平台部署崩溃的问题,直接通过正则替换给不合法的无引号值补全双引号,再用标准库json.loads解析即可,不需要引入第三方依赖。
正则规则说明
匹配模式为 r':\s*([A-Za-z]+)\s*([,}])',各部分含义:
:\s*:匹配键值对的冒号,以及冒号后任意数量的空白字符(兼容不同缩进、空格格式)([A-Za-z]+):捕获连续纯字母组成的无引号值(即AAPL这类任意字母组合的标的代码)\s*([,}]):匹配值后面的任意空白,以及值结尾的逗号或闭合大括号(兼容最后一个字段无逗号的场景)
替换字符串为 r': "\1"\2',作用是给捕获到的纯字母值前后补双引号,同时保留原有的逗号/大括号分隔符,不会破坏原JSON结构。
修改后的可用代码
import re import json from flask import Flask, request app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): # 将请求字节流转为字符串 raw_content = request.data.decode('utf-8') # 替换补全无引号值的双引号 valid_json = re.sub( r':\s*([A-Za-z]+)\s*([,}])', r': "\1"\2', raw_content ) # 正常解析标准JSON webhook_message = json.loads(valid_json) symbol = webhook_message['ticker'] # 后续业务逻辑自行补充 return "success"
适配说明
- 当前规则不会误改原本就带双引号的合法字段,比如示例中的
passphrase、orderAction字段都能正常解析 - 如果后续需要兼容其他无引号值(比如示例中未加引号的ISO格式时间
2022-07-03T01:56:07Z),只需要把捕获组的匹配范围调整为([A-Za-z0-9\-:T]+)即可覆盖时间格式场景 - 整个逻辑只使用Python标准库,不存在第三方依赖在Heroku环境的兼容问题,不会出现无原因崩溃的情况
内容的提问来源于stack exchange,提问作者MouseWarrior
相关产品推荐
相关产品推荐

