python - 在 Python 中解析多个 API 并匹配具有不同键的值
问题描述
在 Python 中,我正在编写一本异国情调的食谱的网络版本,从各种 API 中获取食谱,以便将其发布到新网站。
如何将大约 100 种不同的 JSON 结构映射到我的?
我是否必须像在此示例中使用“get_content_from_api_1”、“...2”等显示的那样手动执行此操作,还是有更好的方法?
与原生 PostgreSql 相比,sqlAlchemy 有没有办法让事情变得更容易?
我面临的限制:
- 各种 API 根本不共享相同的结构
- 一些 API 将具有非扁平结构
- 将有大约 100 个不同的 API,因此有 100 个不同的结构和键名
我拥有的代码的一个工作示例:
from dataclasses import dataclass
import requests
@dataclass
class MyCookingData:
chocolate: str
cucumber: str = None
loaf: str = None
sample_obj_1 = {
"chocolate": "dark",
"cucumber": "long and green",
"loaf": "2 pounds",
}
sample_obj_2 = {
"choco": "milk",
"cuc": "5",
"meatloaf": "juicy",
}
def fetch_the_api(url):
'''Fetch a public url, but return sample objects for the example'''
'''
try:
response = requests.get(url, timeout=5)
except requests.exceptions.HTTPError as err:
print(err)
'''
response = url # sample_obj_ 1 and 2 for the example
return response
def get_content_from_api_1(url):
'''Get url or sample object 1'''
api_data = fetch_the_api(url)
new_data = MyCookingData(
chocolate=api_data['chocolate'],
cucumber=api_data['cucumber'],
loaf=api_data['loaf'],
)
populate_db(new_data)
def get_content_from_api_2(url):
'''Get url or sample object 2'''
api_data = fetch_the_api(url)
new_data = MyCookingData(
chocolate=api_data['choco'],
cucumber=api_data['cuc'],
loaf=api_data['meatloaf'],
)
populate_db(new_data)
def populate_db(data):
'''Store in db, but print for example'''
# print(data.__dict__)
for each_elem in data.__dict__:
print(each_elem, '=>', data.__dict__[each_elem])
def main():
print('Get content from API 1:')
get_content_from_api_1(sample_obj_1)
print('************')
print('Get content from API 2:')
get_content_from_api_2(sample_obj_2)
print('************')
main()
我从运行此代码得到的结果是:
Get content from API 1:
chocolate => dark
cucumber => long and green
loaf => 2 pounds
************
Get content from API 2:
chocolate => milk
cucumber => 5
loaf => juicy
************
解决方案
您也许可以提供更多背景信息,也许还有一些您尝试过但遇到问题的代码 - 查看 SO 指南
话虽如此,您可能最好查看pydantic
而不是数据类(或者可能是 pydantic 的数据类版本)。
数据类本身不会为解析输入做任何事情(尽管有可以在数据类中构建的模块来做到这一点),它们也不会做任何事情来验证类型等。相比之下,如果你需要,Pydantic 会为你做所有这些事情。
推荐阅读
- salesforce - 无法用 Lightning:navigation 或 force:navigateToSObject 替换“force:navigateToURL”
- python - Pandas Dataframe 根据条件通过前一个更新行值
- c++ - 指针和数组与指针和整数 C++
- javascript - 不带 & 的 XMLSerializer
- vb.net - 如何遍历具有子类别列表的类(类别)?即列表(类别)
- python - 托管 Flask(Python) 应用程序引发 CGI 错误
- reactjs - 405 状态 Ngnix React
- java - 多个(或相同)方法可以在一个实例上同时运行吗?
- c++ - 取消引用 unique_ptr 会导致内存地址无限打印
- java - 为什么我使用 setAsyncValue 时会得到 2 组孩子?