最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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使用numpy計算兩個框的iou方法示例

    python使用numpy計算兩個框的iou方法示例

    這篇文章主要介紹了python使用numpy計算兩個框的iou方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 爬蟲框架 Feapder 和 Scrapy 的對比分析

    爬蟲框架 Feapder 和 Scrapy 的對比分析

    本篇文章在源碼層面比對 feapder、scrapy 、scrapy-redis 的設計,閱讀本文后,會加深您對 scrapy 以及 feapder 的了解,以及為什么推薦使用 feapder,剛興趣的朋友可以參考下面文章內容
    2021-09-09
  • python?中?lxml?的?etree?標簽解析

    python?中?lxml?的?etree?標簽解析

    這篇文章主要介紹了python?中l(wèi)xml的etree?標簽解析,文章圍繞主題展開詳細內容,需要的小伙伴可以參考一下,希望對你的學習或工作有所幫助
    2022-04-04
  • Python?遞歸式實現(xiàn)二叉樹前序,中序,后序遍歷

    Python?遞歸式實現(xiàn)二叉樹前序,中序,后序遍歷

    這篇文章主要介紹了Python?遞歸式實現(xiàn)二叉樹前序,中序,后序遍歷,更多相關資料,需要的小伙伴可以參考下面具體的文章內容
    2022-03-03
  • pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明

    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模擬登陸的實現(xiàn)

    這篇文章主要給大家介紹了關于利用selenium 3.7和python3添加cookie模擬登陸的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • 解決pyinstaller打包pyqt5的問題

    解決pyinstaller打包pyqt5的問題

    今天小編就為大家分享一篇解決pyinstaller打包pyqt5的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 忘記ftp密碼的解決方法示例

    忘記ftp密碼的解決方法示例

    忘記ftp密碼了怎么辦?下面介紹一個使用python ftplib庫的方法,大家參考使用吧
    2014-01-01
  • python實現(xiàn)自動下載sftp文件

    python實現(xiàn)自動下載sftp文件

    這篇文章主要為大家詳細介紹了python實現(xiàn)自動下載sftp文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • python異步編程之a(chǎn)syncio低階API的使用詳解

    python異步編程之a(chǎn)syncio低階API的使用詳解

    asyncio中低階API的種類很多,涉及到開發(fā)的5個方面,這篇文章主要為大家詳細介紹了這些低階API的具體使用,感興趣的小伙伴可以學習一下
    2024-01-01

最新評論

盐边县| 屏东市| 南岸区| 丹巴县| 攀枝花市| 潜江市| 云霄县| 平江县| 南通市| 泸西县| 福清市| 伊通| 罗源县| 石泉县| 安吉县| 且末县| 苏州市| 连平县| 静海县| 诏安县| 泰安市| 卓尼县| 辉南县| 临清市| 荔浦县| 枣庄市| 固安县| 大名县| 张家口市| 玉龙| 秀山| 大同市| 县级市| 山阴县| 阿合奇县| 夹江县| 晴隆县| 平塘县| 内江市| 余干县| 永和县|