在 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','text': ''},'text': '2021-04-17'}]},{'name': 'Item 5','text': '2021-02-13'}]},{'name': 'Item 2','text': 'Done'},'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,'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。结果将如下所示。

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 把它弄平。
如果您还有其他问题,请给我评论