Flask API返回JSON对象时如何移除\r字符?
嘿,我之前刚好碰到过一模一样的问题!那些\r字符大概率是从你的数据源里带进来的——比如Windows格式的CSV文件、带回车符的文本数据,或者某些数据库导出时没处理干净的内容。咱们一步步来解决:
方法1:写一个通用清理函数,递归处理所有字段
这个方法最稳妥,不管是字典的键还是值,甚至嵌套的列表结构,都能彻底清理掉\r。先写一个递归清理的函数:
def clean_r_chars(data): if isinstance(data, dict): # 处理字典的每个键和对应的值 return {key.strip('\r'): clean_r_chars(value) for key, value in data.items()} elif isinstance(data, list): # 遍历列表里的每个元素,逐个清理 return [clean_r_chars(item) for item in data] elif isinstance(data, str): # 对字符串类型的值,去掉首尾的\r return data.strip('\r') else: # 非字符串类型(比如数字)直接返回 return data
然后在你的GetPriceData类的get方法里,拿到原始数据后先清理,再返回:
class GetPriceData(Resource): def get(self, date): # 这里是你获取原始数据的逻辑(比如读文件、查数据库) raw_data = ... # 替换成你的实际数据获取代码 # 调用清理函数处理所有\r字符 cleaned_data = clean_r_chars(raw_data) # 返回清理后的JSON数据 return {"data": cleaned_data}
方法2:从数据源读取时直接处理(更高效)
如果你的数据是从CSV文件读取的,那可以在读取阶段就把\r去掉,从源头解决问题:
import csv with open('your_price_data.csv', 'r', newline='') as f: reader = csv.DictReader(f) cleaned_data = [] for row in reader: # 同时处理每一行的键和值 cleaned_row = {key.strip('\r'): value.strip('\r') for key, value in row.items()} cleaned_data.append(cleaned_row)
这样后续返回API的时候,数据本身就不带\r了,比事后处理更高效。
方法3:自定义Flask JSON编码器(仅处理值,适合特殊场景)
如果排查后发现是Flask序列化JSON时的问题(这种情况比较少见),可以自定义编码器处理字符串值:
from flask import Flask from flask.json import JSONEncoder class CleanJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, str): return obj.strip('\r') # 其他类型按默认逻辑处理 return super().default(obj) # 给你的Flask应用绑定自定义编码器 app = Flask(__name__) app.json_encoder = CleanJSONEncoder
注意:这个方法只能处理JSON的值,无法处理键里的\r,所以优先用方法1或方法2。
内容的提问来源于stack exchange,提问作者Erandi
相关产品推荐
相关产品推荐

