Python檢查JSON格式錯誤的多種方法
更新時間:2026年02月15日 08:22:28 作者:detayun
文章介紹了7種處理JSON格式問題的方法,包括使用標準庫、JSON錯誤診斷工具、逐行驗證、jsonschema驗證、命令行工具、在線驗證工具和IDE內置功能,建議對于股票數(shù)據(jù)場景,使用這些方法可以快速定位和修復JSON格式問題,需要的朋友可以參考下
方法1:使用標準庫json.loads()捕獲異常(最常用)
import json
def validate_json(json_str):
"""
驗證JSON字符串格式是否正確
"""
try:
json.loads(json_str)
return True, None
except json.JSONDecodeError as e:
return False, e
# 使用示例
test_cases = [
'{"name": "張三", "age": 25}', # 正確
'{"name": "張三", "age": 25', # 缺少右括號
"{'name': '張三'}", # 單引號錯誤
'{"name": "張三", "age": }', # 缺少值
]
for i, json_str in enumerate(test_cases):
is_valid, error = validate_json(json_str)
print(f"\n測試 {i+1}: {repr(json_str[:50])}")
if is_valid:
print("? JSON格式正確")
else:
print(f"? JSON格式錯誤: {error.msg}")
print(f" 位置: 第{error.lineno}行, 第{error.colno}列")
print(f" 上下文: {repr(error.doc[max(0, error.pos-20):error.pos+20])}")
方法2:詳細的JSON錯誤診斷工具
import json
import re
class JSONValidator:
"""JSON格式驗證器,提供詳細錯誤信息"""
@staticmethod
def validate(json_str, verbose=True):
"""
驗證JSON并返回詳細信息
"""
errors = []
# 檢查1: 是否為空
if not json_str or not json_str.strip():
errors.append("JSON字符串為空")
return False, errors
# 檢查2: 嘗試解析
try:
data = json.loads(json_str)
return True, ["JSON格式正確"]
except json.JSONDecodeError as e:
errors.append(f"解析錯誤: {e.msg}")
errors.append(f"位置: 行{e.lineno}, 列{e.colno}")
errors.append(f"字符位置: {e.pos}")
# 顯示錯誤上下文
context_start = max(0, e.pos - 30)
context_end = min(len(json_str), e.pos + 30)
context = json_str[context_start:context_end]
errors.append(f"上下文: ...{context}...")
# 標記錯誤位置
marker = ' ' * (e.pos - context_start) + '^'
errors.append(f"標記: {marker}")
# 檢查3: 常見格式問題
if "'" in json_str and '"' not in json_str:
errors.append("警告: 檢測到單引號,JSON應使用雙引號")
if json_str.startswith("'") or json_str.startswith('"'):
# 檢查是否有BOM標記
if json_str.startswith('\ufeff'):
errors.append("警告: 檢測到BOM標記")
# 檢查4: 括號匹配
bracket_stack = []
for i, char in enumerate(json_str):
if char in '{[(':
bracket_stack.append((char, i))
elif char in '}])':
if not bracket_stack:
errors.append(f"錯誤: 位置{i}處有未匹配的閉合括號'{char}'")
break
opening, pos = bracket_stack.pop()
if (opening == '{' and char != '}') or \
(opening == '[' and char != ']') or \
(opening == '(' and char != ')'):
errors.append(f"錯誤: 位置{pos}的'{opening}'與位置{i}的'{char}'不匹配")
if bracket_stack:
for opening, pos in bracket_stack:
errors.append(f"錯誤: 位置{pos}的'{opening}'沒有閉合")
return False, errors
@staticmethod
def pretty_print_errors(json_str):
"""
美觀地打印JSON錯誤信息
"""
is_valid, errors = JSONValidator.validate(json_str)
print("=" * 60)
print("JSON格式檢查結果")
print("=" * 60)
print(f"輸入: {repr(json_str[:100])}")
print(f"狀態(tài): {'? 通過' if is_valid else '? 失敗'}")
print("-" * 60)
for error in errors:
print(f" {error}")
print("=" * 60)
return is_valid
# 使用示例
if __name__ == "__main__":
# 測試各種錯誤情況
test_json = """
{"name": "張三", "age": 25, "city": "北京" # 缺少右括號
"""
JSONValidator.pretty_print_errors(test_json)
print("\n" + "=" * 60)
print("測試正確的JSON")
print("=" * 60)
correct_json = '{"name": "張三", "age": 25, "city": "北京"}'
JSONValidator.pretty_print_errors(correct_json)
方法3:逐行驗證大JSON文件
import json
def validate_json_file(filepath):
"""
驗證JSON文件格式
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
json.loads(content)
print(f"? {filepath} 格式正確")
return True
except json.JSONDecodeError as e:
print(f"? {filepath} 格式錯誤:")
print(f" 錯誤: {e.msg}")
print(f" 位置: 行{e.lineno}, 列{e.colno}")
# 顯示錯誤行
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
if e.lineno <= len(lines):
print(f" 錯誤行: {e.lineno}: {lines[e.lineno-1].rstrip()}")
# 標記錯誤位置
marker = ' ' * (e.colno - 1) + '^'
print(f" {marker}")
return False
except FileNotFoundError:
print(f"? 文件不存在: {filepath}")
return False
# 使用示例
# validate_json_file('data.json')
方法4:使用jsonschema驗證JSON結構
import json
from jsonschema import validate, ValidationError, SchemaError
def validate_json_structure(json_str, schema=None):
"""
驗證JSON結構是否符合預期
"""
try:
data = json.loads(json_str)
except json.JSONDecodeError as e:
return False, f"JSON格式錯誤: {e.msg}"
# 如果提供了schema,驗證結構
if schema:
try:
validate(instance=data, schema=schema)
return True, "JSON結構正確"
except ValidationError as e:
return False, f"結構驗證失敗: {e.message}"
except SchemaError as e:
return False, f"Schema錯誤: {e.message}"
return True, "JSON格式正確"
# 使用示例
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number"},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age"]
}
json_str = '{"name": "張三", "age": 25, "email": "zhangsan@example.com"}'
is_valid, message = validate_json_structure(json_str, schema)
print(f"{message}: {is_valid}")
方法5:命令行工具方式
# 保存為 validate_json.py
import json
import sys
import argparse
def main():
parser = argparse.ArgumentParser(description='JSON格式驗證工具')
parser.add_argument('file', nargs='?', help='JSON文件路徑')
parser.add_argument('-s', '--string', help='JSON字符串')
parser.add_argument('-v', '--verbose', action='store_true', help='詳細輸出')
args = parser.parse_args()
# 從文件或字符串讀取
if args.file:
with open(args.file, 'r', encoding='utf-8') as f:
json_str = f.read()
source = f"文件: {args.file}"
elif args.string:
json_str = args.string
source = "字符串"
else:
# 從stdin讀取
json_str = sys.stdin.read()
source = "標準輸入"
# 驗證
try:
data = json.loads(json_str)
print(f"? {source}: JSON格式正確")
if args.verbose:
print(f" 類型: {type(data)}")
if isinstance(data, dict):
print(f" 鍵數(shù)量: {len(data)}")
elif isinstance(data, list):
print(f" 元素數(shù)量: {len(data)}")
sys.exit(0)
except json.JSONDecodeError as e:
print(f"? {source}: JSON格式錯誤", file=sys.stderr)
print(f" 錯誤: {e.msg}", file=sys.stderr)
print(f" 位置: 行{e.lineno}, 列{e.colno}", file=sys.stderr)
if args.verbose:
# 顯示上下文
lines = json_str.split('\n')
if e.lineno <= len(lines):
print(f"\n 錯誤行 {e.lineno}:", file=sys.stderr)
print(f" {lines[e.lineno-1]}", file=sys.stderr)
marker = ' ' * (e.colno - 1) + '^'
print(f" {marker}", file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
main()
使用方式:
# 驗證文件
python validate_json.py data.json
# 驗證字符串
python validate_json.py -s '{"name": "test"}'
# 詳細模式
python validate_json.py -v data.json
# 從管道讀取
echo '{"name": "test"}' | python validate_json.py
方法6:在線驗證和格式化工具
如果不想寫代碼,可以使用這些工具:
- JSONLint: https://jsonlint.com/
- JSON Formatter: https://jsonformatter.curiousconcept.com/
- VS Code插件: JSON相關插件
方法7:使用IDE內置功能
VS Code:
- 安裝 “JSON” 相關擴展
.json文件自動驗證- 快捷鍵:
Ctrl+Space提示
PyCharm:
- 內置JSON驗證
- 自動格式化:
Ctrl+Alt+L - 語法高亮顯示錯誤
實用調試技巧
import json
import traceback
def debug_json_error(json_str):
"""
調試JSON錯誤的實用函數(shù)
"""
print("=" * 70)
print("JSON調試信息")
print("=" * 70)
print(f"長度: {len(json_str)} 字符")
print(f"前100字符: {repr(json_str[:100])}")
print(f"后100字符: {repr(json_str[-100:])}")
# 檢查常見問題
checks = [
("是否為空", lambda s: not s.strip()),
("是否以單引號開頭", lambda s: s.strip().startswith("'")),
("是否包含單引號", lambda s: "'" in s and '"' not in s),
("是否有BOM標記", lambda s: s.startswith('\ufeff')),
("括號是否匹配", lambda s: s.count('{') != s.count('}') or s.count('[') != s.count(']')),
]
print("\n初步檢查:")
for check_name, check_func in checks:
result = check_func(json_str)
status = "? 可能有問題" if result else "? 正常"
print(f" {check_name}: {status}")
# 嘗試解析
print("\n解析嘗試:")
try:
data = json.loads(json_str)
print(f"? 解析成功!")
print(f" 類型: {type(data)}")
if isinstance(data, dict):
print(f" 鍵: {list(data.keys())[:5]}")
return True
except json.JSONDecodeError as e:
print(f"? 解析失敗!")
print(f" 錯誤信息: {e.msg}")
print(f" 位置: 行{e.lineno}, 列{e.colno}")
# 顯示詳細上下文
print(f"\n 錯誤位置上下文:")
start = max(0, e.pos - 50)
end = min(len(json_str), e.pos + 50)
context = json_str[start:end]
print(f" ...{context}...")
# 標記位置
marker_pos = e.pos - start
marker = ' ' * marker_pos + '^'
print(f" {' ' * (marker_pos)}{marker}")
# 顯示周圍幾行
print(f"\n 周圍行:")
lines = json_str.split('\n')
for i in range(max(0, e.lineno-2), min(len(lines), e.lineno+2)):
prefix = " > " if i == e.lineno-1 else " "
print(f" {prefix}行{i+1}: {repr(lines[i][:100])}")
return False
finally:
print("=" * 70)
# 使用示例
if __name__ == "__main__":
# 測試有問題的JSON
bad_json = '''
{
"name": "張三",
'age': 25, # 這里用了單引號
"city": "北京"
}
'''
debug_json_error(bad_json)
推薦方案總結
對于您的股票數(shù)據(jù)場景,建議使用:
import json
import logging
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def safe_json_parse(data_str, source="未知來源"):
"""
安全解析JSON,提供詳細錯誤信息
"""
try:
return json.loads(data_str)
except json.JSONDecodeError as e:
logger.error(f"JSON解析失敗 [{source}]:")
logger.error(f" 錯誤: {e.msg}")
logger.error(f" 位置: 行{e.lineno}, 列{e.colno}")
logger.error(f" 上下文: {repr(data_str[max(0, e.pos-30):e.pos+30])}")
# 嘗試修復建議
if "'" in data_str and '"' not in data_str:
logger.warning(" 建議: 檢測到單引號,嘗試使用 ast.literal_eval 或替換為雙引號")
raise
# 在您的代碼中使用
try:
data_dict = safe_json_parse(data_str, "Redis")
# 處理數(shù)據(jù)...
except json.JSONDecodeError:
# 記錄錯誤并跳過或使用默認值
logger.error("跳過無效數(shù)據(jù)")
continue
這樣可以快速定位和修復JSON格式問題!
以上就是Python檢查JSON格式錯誤的多種方法的詳細內容,更多關于Python檢查JSON格式錯誤的資料請關注腳本之家其它相關文章!
相關文章
Python?遞歸式實現(xiàn)二叉樹前序,中序,后序遍歷
這篇文章主要介紹了Python?遞歸式實現(xiàn)二叉樹前序,中序,后序遍歷,更多相關資料,需要的小伙伴可以參考下面具體的文章內容2022-03-03
pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明
這篇文章主要介紹了pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
利用selenium 3.7和python3添加cookie模擬登陸的實現(xiàn)
這篇文章主要給大家介紹了關于利用selenium 3.7和python3添加cookie模擬登陸的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-11-11
python異步編程之a(chǎn)syncio低階API的使用詳解
asyncio中低階API的種類很多,涉及到開發(fā)的5個方面,這篇文章主要為大家詳細介紹了這些低階API的具體使用,感興趣的小伙伴可以學習一下2024-01-01

