如何对JSON中的多个数字执行前8位隐藏、编码及加密处理
账号串行批量处理实现方案
核心执行逻辑
完全匹配你要求的“单元素全流程处理完成后再处理下一个”的串行规则,整体流程拆解为固定流水线:
- 从给定JSON结构中定位目标数组,即
Body.AccNum对应的账号字符串列表,先做列表非空校验 - 按数组原始顺序逐一遍历元素,严格等当前元素的全流程操作执行完毕,再启动下一个元素的处理,杜绝并发导致的顺序混乱、流程错配问题
- 单个账号的固定处理步骤(顺序不可调换):
- 前8位隐藏:将账号字符串的前8个字符统一替换为
*占位符,保留剩余位置的可见内容。例如原账号000405010255,隐藏后结果为********10255;若账号长度不足8位,则直接全部替换为*避免越界 - 编码操作:对隐藏后的字符串执行你业务规定的编码规则(如Base64、URL编码等)
- 加密操作:对编码后的字符串执行你业务规定的加密规则(如AES、SM4等)
- 前8位隐藏:将账号字符串的前8个字符统一替换为
- 所有元素处理完成后,统一收集最终加密结果,可按需做持久化存储、接口返回等后续操作
可直接复用的代码示例
Python 版本
import json import base64 # 原始JSON数据 raw_json_str = '''{ "Body": { "AccNum": [ "000405010255", "000405010310", "000405009777", "000401109537", "000401113460", "000401116861", "001805015288", "628801537715", "000319000184", "000401193586", "000405111139", "000405501186", "000760004994", "000805015689", "000813001320", "001105024982", "001801080623", "001810042371", "001825075268", "004214109637", "004214109638", "010310000278", "032501004151", "044205008102", "105701000275", "630010075140" ] } }''' # 自定义加密方法,替换为你实际的业务加密逻辑 def custom_encrypt(content: str) -> str: # 此处占位,实际替换为项目内加密实现 return f"encrypted_{content}" def process_single_account(acc_str: str) -> str: # 1. 隐藏前8位 hidden_content = "*" * 8 + acc_str[8:] if len(acc_str) >=8 else "*" * len(acc_str) # 2. 执行编码(此处以UTF-8 Base64编码为例,替换为实际编码逻辑) encoded_content = base64.b64encode(hidden_content.encode("utf-8")).decode("utf-8") # 3. 执行加密 final_content = custom_encrypt(encoded_content) return final_content if __name__ == "__main__": # 解析JSON parsed_data = json.loads(raw_json_str) acc_list = parsed_data["Body"]["AccNum"] process_result = [] error_list = [] # 串行遍历处理 for acc in acc_list: try: single_res = process_single_account(acc) process_result.append(single_res) except Exception as e: error_list.append({"acc": acc, "err_msg": str(e)}) # 后续可对process_result、error_list做落地处理
Node.js 版本
const rawJsonStr = `{ "Body": { "AccNum": [ "000405010255", "000405010310", "000405009777", "000401109537", "000401113460", "000401116861", "001805015288", "628801537715", "000319000184", "000401193586", "000405111139", "000405501186", "000760004994", "000805015689", "000813001320", "001105024982", "001801080623", "001810042371", "001825075268", "004214109637", "004214109638", "010310000278", "032501004151", "044205008102", "105701000275", "630010075140" ] } }` // 自定义异步加密方法,替换为实际业务逻辑 const customEncrypt = async (content) => { return `encrypted_${content}` } const processSingleAccount = async (accStr) => { // 1. 隐藏前8位 const hiddenContent = accStr.length >=8 ? "*".repeat(8) + accStr.slice(8) : "*".repeat(accStr.length) // 2. 编码(此处以Base64编码为例) const encodedContent = Buffer.from(hiddenContent).toString('base64') // 3. 加密 const finalContent = await customEncrypt(encodedContent) return finalContent } // 主流程执行 (async () => { const parsedData = JSON.parse(rawJsonStr) const accList = parsedData.Body.AccNum const processResult = [] const errorList = [] // 注意:使用for...of + await的形式,才能保证串行执行,不能用forEach(不会等待异步操作完成) for (const acc of accList) { try { const singleRes = await processSingleAccount(acc) processResult.push(singleRes) } catch (e) { errorList.push({acc, errMsg: e.message}) } } // 后续结果处理 })()
关键注意事项
- 异步环境下的串行保障:如果是在JS、Python异步场景下,不要用数组自带的
forEach、map等遍历方法,这类方法不会等待内部异步操作完成,会直接并发执行所有元素的处理,不符合你“处理完一个再下一个”的要求,必须用普通for循环搭配await实现严格串行 - 异常兜底:单元素处理逻辑需要加独立的异常捕获,避免单个账号格式错误、加密接口异常导致整个批量流程中断,失败的元素单独记录便于后续重试
- 边界兼容:对长度不足8位的账号做特殊处理,避免字符串切片时出现索引越界的问题
内容的提问来源于stack exchange,提问作者Deval Soni
相关产品推荐
相关产品推荐

