python - 使用 Python 将 Json 转换为换行 Json 标准
问题描述
我有一个获取嵌套对象并删除所有嵌套的代码(使对象变平):
def flatten_json(y):
"""
@param y: Unflated Json
@return: Flated Json
"""
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
elif type(x) is list:
out[name[:-1]] = x
else:
out[name[:-1]] = x
flatten(y)
return out
def generatejson(response):
sample_object = pd.DataFrame(response.json())['results'].to_dict()
flat = {k: flatten_json(v) for k, v in sample_object.items()}
return json.dumps(flat, sort_keys=True)
respons= requests.get(urlApi, data=data, headers=hed, verify=False)
flat1 = generatejson(respons)
....
storage.Bucket(BUCKET_NAME).item(path).write_to(flat1, 'application/json')
这将执行以下操作:
- 从 API 获取调用
- 移除嵌套对象
- 生成json
- 将 json 上传到 Google 存储。
这很好用。问题是 BigQuery 不支持 Json,所以我需要在上传之前将其转换为换行 Json 标准格式。
有没有办法改变返回json.dumps(flat, sort_keys=True)
,所以它会返回新的 Json 格式而不是常规的 Json?
我的 Json 示例:
{"0": {"code": "en-GB", "id": 77, "languageName": "English", "name": "English"},
"1": {"code": "de-DE", "id": 78, "languageName": "Deutsch", "name": "German"}}
编辑:
新行 json 的预期结果是:
{"languageName":"English","code":"en-GB","id":2,"name":"English"}
{"languageName":"Deutsch","code":"de-DE","id":5,"name":"German"}
例如,如果我接受 API 调用并执行以下操作:
df['results'].to_json(orient="records",lines=True)
这将提供所需的输出。但我不能这样做,因为json.dumps(flat, sort_keys=True)
那里没有使用数据框。
解决方案
我想你正在寻找这样的东西?
import json
def create_jsonlines(original):
if isinstance(original, str):
original = json.loads(original)
return '\n'.join([json.dumps(original[outer_key], sort_keys=True)
for outer_key in sorted(original.keys(),
key=lambda x: int(x))])
# Added fake record to prove order is sorted
inp = {
"3": {"code": "en-FR", "id": 76, "name": "French", "languageName": "French"},
"0": {"code": "en-GB", "id": 77, "languageName": "English", "name": "English"},
"1": {"code": "de-DE", "id": 78, "languageName": "Deutsch", "name": "German"}
}
output = create_jsonlines(inp)
print(output)
推荐阅读
- python - 将现有 Python SAV 文件导入环境
- node.js - 使用 `npm i` 时不会生成 package-lock.json (npm v6.3.0, node v8.9.2)
- php - Laravel 错误 SQLSTATE[42000]:语法错误或访问冲突:1055
- c++ - 在结构中嵌入函数汇编代码
- javascript - 在数组中搜索同样不同的数字
- xpath - 如何使用 Xpath 从具有特定标题的表中获取行
- pandas - 如何使不同的列在 holoviews / hvplot 中呈现为不同的颜色?
- c++ - 编译器对 sin() 使用哪种近似算法?
- python - 使用深度学习防止在多类分类中过度拟合特定类
- angular - 在 Angular 6 中部署后的字体