Flask响应丢失字符串中不可打印字符问题求助
解决JSON响应中保留\x1d控制字符的问题
问题原因
\x1d是ASCII控制字符(分组分隔符GS),JSON规范仅支持有限的转义字符(如\n、\t、\"等),对于这类不在允许列表里的控制字符,Python的json模块默认序列化时会直接丢弃,导致返回的JSON中丢失该字符。而控制台打印时会保留原始字符(只是可能无法可视化显示),所以看起来正常。
解决方案
方案1:手动替换为JSON兼容的转义形式
直接把\x1d替换为JSON支持的Unicode转义序列\u001d(\x1d对应的Unicode码点是U+001D),示例代码:
import json original_str = '\x1d0103671286378126378127812\x1d1232321102I009B\x1d71012321271' # 将\x1d替换为JSON可识别的\u001d processed_str = original_str.replace('\x1d', '\\u001d') # 序列化生成JSON json_output = json.dumps({"content": processed_str}) print(json_output)
序列化后的JSON会保留\u001d,接收方可以通过反向替换恢复原始字符。
方案2:自定义JSON编码器(通用处理所有控制字符)
如果字符串中还有其他类似的ASCII控制字符,自定义编码器可以批量处理所有不被JSON允许的控制字符:
import json class ControlCharEncoder(json.JSONEncoder): def encode(self, obj): if isinstance(obj, str): escaped_chars = [] for char in obj: char_code = ord(char) # 只保留JSON允许的控制字符,其余转成\uXXXX格式 if 0x00 <= char_code <= 0x1F and char not in '\n\t\r\b\f': escaped_chars.append(f'\\u{char_code:04x}') else: escaped_chars.append(char) return '"' + ''.join(escaped_chars) + '"' # 非字符串类型沿用默认处理逻辑 return super().encode(obj) original_str = '\x1d0103671286378126378127812\x1d1232321102I009B\x1d71012321271' # 使用自定义编码器序列化 json_output = json.dumps({"content": original_str}, cls=ControlCharEncoder) print(json_output)
适配Flask的jsonify
如果用Flask框架的jsonify返回响应,只需替换应用的默认JSON编码器即可:
from flask import Flask, jsonify app = Flask(__name__) # 注册自定义编码器 app.json_encoder = ControlCharEncoder @app.route('/get-data') def get_data(): original_str = '\x1d0103671286378126378127812\x1d1232321102I009B\x1d71012321271' return jsonify({"content": original_str}) if __name__ == '__main__': app.run(debug=True)
内容的提问来源于stack exchange,提问作者eltomato
相关产品推荐
相关产品推荐

