Flask中如何生成逐行显示的可下载JSON文件?
解决JSON文件换行格式化的问题
嗨,这事儿好办!你有两种选择,完全看你想要的最终格式:
选项1:保留外层数组,每个字典单独一行(带缩进)
只需要给json.dumps加上indent参数,它会自动帮你格式化JSON结构,让每个字典单独占一行,还能加上缩进让结构更清晰:
import json from flask import make_response import urllib.parse tasks_info = [ {"task_name":"task1","task_info":"aaaaa"}, {"task_name":"task2","task_info":"bbbbb"}, {"task_name":"task3","task_info":"ccccc"} ] # 关键是加上indent参数,值可以是2、4这类数字,表示缩进的空格数 data = json.dumps(tasks_info, default=str, indent=2) response = make_response(data, 200, {'mimetype': 'application/json'}) response.headers['Content-Disposition'] = "attachment;filename={}.json".format(urllib.parse.quote('result')) return response
生成的JSON文件内容会变成这样:
[ { "task_name": "task1", "task_info": "aaaaa" }, { "task_name": "task2", "task_info": "bbbbb" }, { "task_name": "task3", "task_info": "ccccc" } ]
选项2:去掉外层数组,每行一个独立的JSON对象(JSON Lines格式)
如果不需要外层的数组,想让每个字典单独成为一行独立的JSON,那我们可以遍历列表里的每个字典,分别转成JSON字符串再用换行符拼接:
import json from flask import make_response import urllib.parse tasks_info = [ {"task_name":"task1","task_info":"aaaaa"}, {"task_name":"task2","task_info":"bbbbb"}, {"task_name":"task3","task_info":"ccccc"} ] # 遍历每个任务,转成JSON字符串后用换行连接 lines = [json.dumps(task, default=str) for task in tasks_info] data = '\n'.join(lines) response = make_response(data, 200, {'mimetype': 'application/json'}) # 也可以把mimetype改成application/jsonlines更标准,不过application/json也能正常使用 # response = make_response(data, 200, {'mimetype': 'application/jsonlines'}) response.headers['Content-Disposition'] = "attachment;filename={}.json".format(urllib.parse.quote('result')) return response
生成的文件内容就是你想要的每行一个字典:
{"task_name":"task1","task_info":"aaaaa"} {"task_name":"task2","task_info":"bbbbb"} {"task_name":"task3","task_info":"ccccc"}
这两种方式都能满足你的需求,选哪个就看你后续对JSON文件的使用场景啦~
内容的提问来源于stack exchange,提问作者McCree Feng
相关产品推荐
相关产品推荐

