1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- # -*- coding: utf-8 -*-
- import ast
- import json
- import re
- def get_json(data, limit=10):
- """
- 返回json对象
- @param str data: json_str
- @param int limit: json_str 结构修正次数上限
- """
- retries = 0
- try:
- data = ast.literal_eval(data)
- return json.loads(json.dumps(data, ensure_ascii=False))
- except SyntaxError:
- while retries < limit:
- try:
- parsed_data = json.loads(data)
- # print("字符串符合JSON格式")
- # print(parsed_data)
- return parsed_data
- except json.JSONDecodeError as e:
- retries += 1
- error_pos = e.pos
- err_msg = e.msg
- # print("字符串不符合JSON格式")
- # print("错误位置:", error_pos)
- # print("错误原因:", err_msg)
- data = data[:-1] if data.endswith(",") else data
- # 补全'[{...}]' 缺失符号
- missing_bracket_count = data.count('[{') - data.count('}]')
- if missing_bracket_count > 0:
- for i in range(missing_bracket_count):
- delimiter = ']' if i == 0 and data.endswith("}") else '}]'
- data += delimiter
- continue
- # 补全缺失闭合符号
- missing_closing_bracket_count = data.count('{') - data.count('}')
- if missing_closing_bracket_count > 0:
- for i in range(missing_closing_bracket_count):
- data += '}'
- continue
- # 双引号替换单引号
- if 'Expecting property name enclosed in double quotes' == err_msg:
- data = data.replace("'", '"')
- try:
- data = ast.literal_eval(data)
- data = json.dumps(data, ensure_ascii=False)
- except SyntaxError:
- pass
- continue
- # 缺失符号补全
- if 'delimiter' in err_msg:
- ret = re.search('Expecting(.*?)delimiter', err_msg).group(1)
- delimiter = ret.strip().replace("'", '')
- data = "".join([data[:error_pos], delimiter, data[error_pos:]])
- continue
|