Python结合NiFi生成JSON:如何消除反斜杠与Unicode编码问题
解决JSON生成与验证问题的具体方案
一、消除反斜杠和Unicode前缀(u'...')
问题核心是用string.Template替换后,错误依赖Python默认字符串转换(如str())处理结果,而非用json模块做标准化序列化。修正步骤:
- 确保JSON模板是合法格式(字符串用双引号、结构完整),示例模板:
{"name": "$name", "address": "$address"} - 替换后不要直接输出字符串,而是先转字典再序列化:
from string import Template import json with open('data.txt', 'r', encoding='utf-8') as f: template_str = f.readline().strip() template = Template(template_str) # 处理参数行(此处假设参数用逗号分隔,可根据实际调整解析逻辑) for line in f: params = line.strip().split(',') param_dict = {"name": params[0], "address": params[1]} # 替换模板并转标准JSON replaced_str = template.substitute(param_dict) json_obj = json.loads(replaced_str) final_json = json.dumps(json_obj, ensure_ascii=False) print(final_json) - 关键:
json.dumps()的ensure_ascii=False参数可保留非ASCII字符,避免转为Unicode编码。
二、解决JSON验证的"Expecting , delimiter"错误
该错误源于生成的JSON存在语法问题,针对你的场景排查:
- 参数分隔逻辑适配:
地址含逗号时,用split(',')会拆分参数导致结构破坏。改用CSV模块解析参数行(自动处理含逗号的字段):import csv with open('data.txt', 'r', encoding='utf-8') as f: template_str = f.readline().strip() template = Template(template_str) reader = csv.reader(f) for params in reader: param_dict = {"name": params[0], "address": params[1]} replaced_str = template.substitute(param_dict) json_obj = json.loads(replaced_str) final_json = json.dumps(json_obj, ensure_ascii=False) print(final_json) - 特殊字符转义:
若参数含双引号,替换前需转义避免破坏JSON结构:param_dict["address"] = param_dict["address"].replace('"', '\\"') - 强制语法校验:
替换后先打印replaced_str,检查是否存在未闭合引号、多余逗号等语法错误。
三、多模板场景适配建议
如果模板种类多,可优化为:
- 将模板按类型单独存为JSON文件,使用时读取对应文件
- 统一参数行格式为键值对(如
name=张三,address=xxx),解析更灵活:param_line = line.strip() param_dict = {} for item in param_line.split(','): key, value = item.split('=', 1) param_dict[key.strip()] = value.strip()
内容的提问来源于stack exchange,提问作者scoutjohn13
相关产品推荐
相关产品推荐

