动态处理JSON格式值参数化处理

一、主要功能

        1.1、核心功能:递归地查找并替换字典、列表或字符串中所有以&.为前缀的字段值。
         1.2、替换规则:将&.xxx形式的字符串替换为预定义的变量值。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Users: LiMu
# @Files: parametric.py
# @Times: 2025/6/18 
# @Software: PyCharm

import os
import json
import time
import random
import re
from tools.global_data import globaldict
from typing import Any, Dict


class DictParameterReplacer:
    def __init__(self):
        self.project_variables = globaldict


    def replace_ampersand_fields(self, data: Any,all_dict:dict=None) -> Any:
        """
        :replace_ampersand_fields: 递归替换字典中所有包含'&.'前缀的字段值
        :param data: 要处理的数据(支持字典/列表/基本类型)
        :all_dict: 自定义替换参数
        :return: 处理后的数据
        """
        if all_dict is not None:
            self.project_variables = all_dict

        if isinstance(data, dict):
            return {k: self.replace_ampersand_fields(v) for k, v in data.items()}
        elif isinstance(data, list):
            return [self.replace_ampersand_fields(item) for item in data]
        elif isinstance(data, str):
            return self._replace_ampersand_values(data)
        return data

    def _replace_ampersand_values(self, value: str) -> str:
        """
        :_replace_ampersand_values: 替换字符串中的&.字段为项目变量
        :param value: 包含&.的字符串
        :return: 替换后的字符串
        """
        if not isinstance(value, str) or '&.' not in value:
            return value

        # 使用正则匹配所有&.字段
        pattern = r'&\.(\w+)'
        matches = re.finditer(pattern, value)
        result = value

        for match in matches:
            full_match = match.group(0)  # 匹配到的完整字符串(如 &.DeskID1)
            field_name = match.group(1)  # 捕获组提取的字段名(如 DeskID1)

            # 从项目变量中获取替换值,如果不存在则保留原值
            replacement = self.project_variables.get(field_name, full_match)
            result = result.replace(full_match, str(replacement))

        return result


# 使用示例
if __name__ == "__main__":
    # 创建替换器实例
    replacer = DictParameterReplacer()

    # old_data原始数据(含多层嵌套和&.字段),
    old_data = {"Token":"","SessionID":"&.SessionID","Data":{"DeskID1":"&.DeskID1","DeskID2":'&.DeskID1',"Nested":{"User":"User_&.UserID","Other":["&.Item1","normal"]}}}
    replaced_data = {"SessionID":"6666","DeskID1":"Desk00000001","User":"u9550"}

    # 执行替换
    new_data = replacer.replace_ampersand_fields(old_data,replaced_data)

    #调试打印
    print("未替换的原始数据:{}".format(old_data))
    print("替换后的新新数据:{}".format(new_data))

二、类结构

2.1、DictParameterReplacer 类

        2.1.1、初始化方法 init
        2.1.2、初始化时从globaldict(全局数据模块)获取项目变量

2.2、主要方法

2.2.1、replace_ampersand_fields

递归处理数据,支持字典、列表和基本类型

参数:

data: 要处理的数据

all_dict: 可选的自定义替换参数字典

如果提供了all_dict,则用它替换默认的项目变量

2.2.2、_replace_ampersand_values (私有方法)

实际执行字符串替换

使用正则表达式匹配所有&.前缀的字段

从项目变量中查找替换值,找不到则保留原值

三、代码特点

递归处理:能处理多层嵌套的数据结构

类型安全:严格检查输入数据类型

灵活性:

支持自定义替换字典

找不到匹配变量时保留原值

正则表达式:使用re模块高效匹配替换模式

四、示例使用

脚本底部提供了一个使用示例:

创建包含&.前缀字段的嵌套字典

定义替换值字典

执行替换并打印结果

五、潜在用途

这种参数替换机制常用于:

测试框架中的参数化

配置文件的动态处理

模板渲染

API请求的预处理

六、改进建议

可以添加对${var}或{{var}}等其他常见变量格式的支持

考虑添加日志记录替换过程

可以增加对默认值的支持,如&.var|default语法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容