python - 在 Python 中标准化 Monday.com API JSON 输出
问题描述
我最终试图从 Monday.com API 请求的 JSON 输出中生成 csv。
以下是我到目前为止的代码。我在尝试将 JSON 展平为表格时遇到了麻烦。
import requests
import json
import pandas as pd
apiKey = "API Key Here"
apiUrl = "https://api.monday.com/v2"
headers = {"Authorization" : apiKey}
query2 = '{boards(ids:123456) {items{name, column_values{title text } } } }'
data = {'query' : query2}
json_data = json.loads(requests.post(url=apiUrl, json=data, headers=headers).text)
norm=pd.json_normalize(json_data, 'items',['data', 'boards'])
来自 API 的 JSON 输出。为了便于阅读,我添加了一些换行符。
{'data':
{'boards':
[{'items':
[{'name': 'Item 1', 'column_values': [{'title': 'Person', 'text': 'Mark McCoy'}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-02-05'}]},
{'name': 'This is a new item', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-04-17'}]},
{'name': 'Item 5', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': None}, {'title': 'Date', 'text': '2021-02-13'}]},
{'name': 'Item 2', 'column_values': [{'title': 'Person', 'text': ''}, {'title': 'Status', 'text': 'Done'}, {'title': 'Date', 'text': '2021-05-14'}]}]}]},
'account_id': 00000000}
当我在终端中运行 .py 文件时,我得到以下输出
Traceback (most recent call last):
File "/Users/markamccoy/Desktop/MondayPy/stack.py", line 14, in <module>
norm=pd.json_normalize(json_data, 'items',['data', 'boards'])
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 336, in _json_normalize
_recursive_extract(data, record_path, {}, level=0)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 309, in _recursive_extract
recs = _pull_records(obj, path[0])
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 248, in _pull_records
result = _pull_field(js, spec)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/io/json/_normalize.py", line 239, in _pull_field
result = result[spec]
KeyError: 'items'
我完全是 python 菜鸟,阅读 pandas 文档已经让我走到了这一步,但我有点脱离了我的元素。
解决方案
如果您使用 normalize.the 结果将如下所示。
df = pd.json_normalize(json_data['data']['boards'][0]['items'],record_path='column_values',meta=['name'])
title text name
0 Person Mark McCoy Item 1
1 Status None Item 1
2 Date 2021-02-05 Item 1
3 Person This is a new item
4 Status None This is a new item
5 Date 2021-04-17 This is a new item
但我认为这不是您想要的。并且没有示例可以在 json_normalize 中展平这种数组。
data = [ [item['name']]+[c_v['text'] for c_v in item['column_values']] for item in json_data['data']['boards'][0]['items']]
df = pd.DataFrame(data,columns=['name','Person','Status','Date'])
name Person Status Date
0 Item 1 Mark McCoy None 2021-02-05
1 This is a new item None 2021-04-17
2 Item 5 None 2021-02-13
3 Item 2 Done 2021-05-14
所以我只能用python把它弄平。
如果您还有其他问题。请给我评论
推荐阅读
- python - 无法从网站的登录页面获取所有名称
- javascript - 我的数组包含一个空格 [" "]。当我 .join 带有下划线的空格时,结果字符串中的空格元素在 html 中不可见
- java - 如何使用存储在变量值中的数据类型进行转换?
- php - 如果字段名称为 logo[0][image],如何上传图片
- asp.net - 为什么 post 方法必须带有查询字符串?如何删除查询字符串?
- c++ - C++ 反射和到/从键值对(如 json)
- wordpress - 如何更改 woocommerce 页面的语言,例如结帐和添加到购物车?
- android - 如何在旋转时在Android的多选对话框中保留选择?
- java - 如何从数组列表中加载图像?
- javascript - 如何在 MutationObserver 中添加的节点上使用 querySelectorAll