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

Python檢查JSON格式錯(cuò)誤的多種方法

 更新時(shí)間:2026年02月15日 08:22:28   作者:detayun  
文章介紹了7種處理JSON格式問題的方法,包括使用標(biāo)準(zhǔn)庫、JSON錯(cuò)誤診斷工具、逐行驗(yàn)證、jsonschema驗(yàn)證、命令行工具、在線驗(yàn)證工具和IDE內(nèi)置功能,建議對于股票數(shù)據(jù)場景,使用這些方法可以快速定位和修復(fù)JSON格式問題,需要的朋友可以參考下

方法1:使用標(biāo)準(zhǔn)庫json.loads()捕獲異常(最常用)

import json

def validate_json(json_str):
    """
    驗(yàn)證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': '張三'}",             # 單引號錯(cuò)誤
    '{"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格式錯(cuò)誤: {error.msg}")
        print(f"  位置: 第{error.lineno}行, 第{error.colno}列")
        print(f"  上下文: {repr(error.doc[max(0, error.pos-20):error.pos+20])}")

方法2:詳細(xì)的JSON錯(cuò)誤診斷工具

import json
import re

class JSONValidator:
    """JSON格式驗(yàn)證器,提供詳細(xì)錯(cuò)誤信息"""
    
    @staticmethod
    def validate(json_str, verbose=True):
        """
        驗(yàn)證JSON并返回詳細(xì)信息
        """
        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"解析錯(cuò)誤: {e.msg}")
            errors.append(f"位置: 行{e.lineno}, 列{e.colno}")
            errors.append(f"字符位置: {e.pos}")
            
            # 顯示錯(cuò)誤上下文
            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}...")
            
            # 標(biāo)記錯(cuò)誤位置
            marker = ' ' * (e.pos - context_start) + '^'
            errors.append(f"標(biāo)記:   {marker}")
            
            # 檢查3: 常見格式問題
            if "'" in json_str and '"' not in json_str:
                errors.append("警告: 檢測到單引號,JSON應(yīng)使用雙引號")
            
            if json_str.startswith("'") or json_str.startswith('"'):
                # 檢查是否有BOM標(biāo)記
                if json_str.startswith('\ufeff'):
                    errors.append("警告: 檢測到BOM標(biāo)記")
            
            # 檢查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"錯(cuò)誤: 位置{i}處有未匹配的閉合括號'{char}'")
                        break
                    opening, pos = bracket_stack.pop()
                    if (opening == '{' and char != '}') or \
                       (opening == '[' and char != ']') or \
                       (opening == '(' and char != ')'):
                        errors.append(f"錯(cuò)誤: 位置{pos}的'{opening}'與位置{i}的'{char}'不匹配")
            
            if bracket_stack:
                for opening, pos in bracket_stack:
                    errors.append(f"錯(cuò)誤: 位置{pos}的'{opening}'沒有閉合")
            
            return False, errors
    
    @staticmethod
    def pretty_print_errors(json_str):
        """
        美觀地打印JSON錯(cuò)誤信息
        """
        is_valid, errors = JSONValidator.validate(json_str)
        
        print("=" * 60)
        print("JSON格式檢查結(jié)果")
        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__":
    # 測試各種錯(cuò)誤情況
    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:逐行驗(yàn)證大JSON文件

import json

def validate_json_file(filepath):
    """
    驗(yàn)證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} 格式錯(cuò)誤:")
        print(f"  錯(cuò)誤: {e.msg}")
        print(f"  位置: 行{e.lineno}, 列{e.colno}")
        
        # 顯示錯(cuò)誤行
        with open(filepath, 'r', encoding='utf-8') as f:
            lines = f.readlines()
            if e.lineno <= len(lines):
                print(f"  錯(cuò)誤行: {e.lineno}: {lines[e.lineno-1].rstrip()}")
                # 標(biāo)記錯(cuò)誤位置
                marker = ' ' * (e.colno - 1) + '^'
                print(f"           {marker}")
        return False
    except FileNotFoundError:
        print(f"? 文件不存在: {filepath}")
        return False

# 使用示例
# validate_json_file('data.json')

方法4:使用jsonschema驗(yàn)證JSON結(jié)構(gòu)

import json
from jsonschema import validate, ValidationError, SchemaError

def validate_json_structure(json_str, schema=None):
    """
    驗(yàn)證JSON結(jié)構(gòu)是否符合預(yù)期
    """
    try:
        data = json.loads(json_str)
    except json.JSONDecodeError as e:
        return False, f"JSON格式錯(cuò)誤: {e.msg}"
    
    # 如果提供了schema,驗(yàn)證結(jié)構(gòu)
    if schema:
        try:
            validate(instance=data, schema=schema)
            return True, "JSON結(jié)構(gòu)正確"
        except ValidationError as e:
            return False, f"結(jié)構(gòu)驗(yàn)證失敗: {e.message}"
        except SchemaError as e:
            return False, f"Schema錯(cuò)誤: {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格式驗(yàn)證工具')
    parser.add_argument('file', nargs='?', help='JSON文件路徑')
    parser.add_argument('-s', '--string', help='JSON字符串')
    parser.add_argument('-v', '--verbose', action='store_true', help='詳細(xì)輸出')
    
    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 = "標(biāo)準(zhǔn)輸入"
    
    # 驗(yàn)證
    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"  元素?cái)?shù)量: {len(data)}")
        sys.exit(0)
    except json.JSONDecodeError as e:
        print(f"? {source}: JSON格式錯(cuò)誤", file=sys.stderr)
        print(f"  錯(cuò)誤: {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  錯(cuò)誤行 {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()

使用方式:

# 驗(yàn)證文件
python validate_json.py data.json

# 驗(yàn)證字符串
python validate_json.py -s '{"name": "test"}'

# 詳細(xì)模式
python validate_json.py -v data.json

# 從管道讀取
echo '{"name": "test"}' | python validate_json.py

方法6:在線驗(yàn)證和格式化工具

如果不想寫代碼,可以使用這些工具:

  • JSONLint: https://jsonlint.com/
  • JSON Formatter: https://jsonformatter.curiousconcept.com/
  • VS Code插件: JSON相關(guān)插件

方法7:使用IDE內(nèi)置功能

VS Code:

  • 安裝 “JSON” 相關(guān)擴(kuò)展
  • .json 文件自動(dòng)驗(yàn)證
  • 快捷鍵: Ctrl+Space 提示

PyCharm:

  • 內(nèi)置JSON驗(yàn)證
  • 自動(dòng)格式化: Ctrl+Alt+L
  • 語法高亮顯示錯(cuò)誤

實(shí)用調(diào)試技巧

import json
import traceback

def debug_json_error(json_str):
    """
    調(diào)試JSON錯(cuò)誤的實(shí)用函數(shù)
    """
    print("=" * 70)
    print("JSON調(diào)試信息")
    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標(biāo)記", 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"  錯(cuò)誤信息: {e.msg}")
        print(f"  位置: 行{e.lineno}, 列{e.colno}")
        
        # 顯示詳細(xì)上下文
        print(f"\n  錯(cuò)誤位置上下文:")
        start = max(0, e.pos - 50)
        end = min(len(json_str), e.pos + 50)
        context = json_str[start:end]
        print(f"    ...{context}...")
        
        # 標(biāo)記位置
        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)

推薦方案總結(jié)

對于您的股票數(shù)據(jù)場景,建議使用:

import json
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def safe_json_parse(data_str, source="未知來源"):
    """
    安全解析JSON,提供詳細(xì)錯(cuò)誤信息
    """
    try:
        return json.loads(data_str)
    except json.JSONDecodeError as e:
        logger.error(f"JSON解析失敗 [{source}]:")
        logger.error(f"  錯(cuò)誤: {e.msg}")
        logger.error(f"  位置: 行{e.lineno}, 列{e.colno}")
        logger.error(f"  上下文: {repr(data_str[max(0, e.pos-30):e.pos+30])}")
        
        # 嘗試修復(fù)建議
        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:
    # 記錄錯(cuò)誤并跳過或使用默認(rèn)值
    logger.error("跳過無效數(shù)據(jù)")
    continue

這樣可以快速定位和修復(fù)JSON格式問題!

以上就是Python檢查JSON格式錯(cuò)誤的多種方法的詳細(xì)內(nèi)容,更多關(guān)于Python檢查JSON格式錯(cuò)誤的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python使用numpy計(jì)算兩個(gè)框的iou方法示例

    python使用numpy計(jì)算兩個(gè)框的iou方法示例

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

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

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

    python?中?lxml?的?etree?標(biāo)簽解析

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

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

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

    pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明

    這篇文章主要介紹了pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 利用selenium 3.7和python3添加cookie模擬登陸的實(shí)現(xiàn)

    利用selenium 3.7和python3添加cookie模擬登陸的實(shí)現(xiàn)

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

    解決pyinstaller打包pyqt5的問題

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

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

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

    python實(shí)現(xiàn)自動(dòng)下載sftp文件

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

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

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

最新評論

宜川县| 花垣县| 方城县| 定陶县| 荔波县| 冷水江市| 平利县| 通州区| 察雅县| 冕宁县| 即墨市| 兴业县| 磐石市| 正蓝旗| 肥东县| 玉屏| 湖口县| 远安县| 进贤县| 金阳县| 额济纳旗| 清水河县| 辽中县| 息烽县| 原平市| 洛浦县| 文成县| 东兰县| 贵溪市| 泗水县| 玉田县| 朝阳县| 独山县| 禄丰县| 谢通门县| 梅州市| 会东县| 红原县| 中江县| 台安县| 南乐县|