Google API python 将对象转换为 json
Google API python convert object to json
在过去的 5 年里,我在 AWS 中与 Boto3 打交道,之后才开始接触 google API。
我的问题是以下代码片段:
from google.cloud import resource_manager
def main():
client = resource_manager.Client()
# List all projects you have access to
for project in client.list_projects():
print(project['name'] + "" + project['status'])
if __name__ == '__main__':
main()
但是,对于那些知情者 - 您知道 project 是一个 Project 对象,而不是 dict。因此我无法通过这种方式访问它的子项。
我尝试使用 json.dumps(project) 转换项目,但它声称它不可序列化。我玩过 flask 和 jsonify,但对于一个简单的脚本来说,列出项目及其状态的开销太大了。这是我需要编写的众多脚本之一。所以我需要找到一种干净的方法将这些类型的对象转换为 json 格式。
这是项目对象的实际样子:
project = {Project} <Project: 'remove label' ('sys-1234')>
full_name = {str} 'projects/sys-1234'
labels = {dict: 0} {}
name = {str} 'remove label'
number = {str} '571234'
parent = {dict: 2} {'type': 'folder', 'id': '561234'}
path = {str} '/projects/sys-1234'
project_id = {str} 'sys-1234'
status = {str} 'ACTIVE'
有人可以帮忙吗?在过去的几年里,我一直被 Boto 库编写得很好且易于使用而宠坏了。正在为这个而苦苦挣扎。
请指教,谢谢
除非您手动编写一些代码,否则您无法将 class 完全转换为 json。某些 classes 具有不可序列化的对象。
资源管理器对象有一个字典属性__dict__
{
'_client': <google.cloud.resource_manager.client.Client object at 0x000002A6391A89D0>,
'project_id': 'mystic-advice-090909',
'name': 'Mystic Advice',
'number': '999999999999',
'labels': {},
'status': 'ACTIVE',
'parent': None
}
你可以通过处理字典得到一个近似值:
j = project.__dict__
j2 = {}
for k in j:
if isinstance(j[k], str):
j2[k] = j[k]
print(j2)
这导致:
{
'project_id': 'mystic-advice-090909',
'name': 'Mystic Advice',
'number': '999999999999',
'labels': {},
'status': 'ACTIVE',
'parent': None
}
注意:我的简单循环不处理本身就是字典的子项。您需要为这些情况添加额外的代码。示例 if isinstance(j[k], dict):
如果您想发挥创意,可以使用将对象转换为 JSON:
的方法扩展项目 class
def to_json(self):
j = self.__dict__
j2 = {}
for k in j:
if isinstance(j[k], dict):
j2[k] = j[k]
if isinstance(j[k], str):
j2[k] = j[k]
return j2
resource_manager.project.Project.to_json = to_json
client = resource_manager.Client()
for project in client.list_projects():
print(project.to_json())
在过去的 5 年里,我在 AWS 中与 Boto3 打交道,之后才开始接触 google API。
我的问题是以下代码片段:
from google.cloud import resource_manager
def main():
client = resource_manager.Client()
# List all projects you have access to
for project in client.list_projects():
print(project['name'] + "" + project['status'])
if __name__ == '__main__':
main()
但是,对于那些知情者 - 您知道 project 是一个 Project 对象,而不是 dict。因此我无法通过这种方式访问它的子项。
我尝试使用 json.dumps(project) 转换项目,但它声称它不可序列化。我玩过 flask 和 jsonify,但对于一个简单的脚本来说,列出项目及其状态的开销太大了。这是我需要编写的众多脚本之一。所以我需要找到一种干净的方法将这些类型的对象转换为 json 格式。
这是项目对象的实际样子:
project = {Project} <Project: 'remove label' ('sys-1234')>
full_name = {str} 'projects/sys-1234'
labels = {dict: 0} {}
name = {str} 'remove label'
number = {str} '571234'
parent = {dict: 2} {'type': 'folder', 'id': '561234'}
path = {str} '/projects/sys-1234'
project_id = {str} 'sys-1234'
status = {str} 'ACTIVE'
有人可以帮忙吗?在过去的几年里,我一直被 Boto 库编写得很好且易于使用而宠坏了。正在为这个而苦苦挣扎。
请指教,谢谢
除非您手动编写一些代码,否则您无法将 class 完全转换为 json。某些 classes 具有不可序列化的对象。
资源管理器对象有一个字典属性__dict__
{
'_client': <google.cloud.resource_manager.client.Client object at 0x000002A6391A89D0>,
'project_id': 'mystic-advice-090909',
'name': 'Mystic Advice',
'number': '999999999999',
'labels': {},
'status': 'ACTIVE',
'parent': None
}
你可以通过处理字典得到一个近似值:
j = project.__dict__
j2 = {}
for k in j:
if isinstance(j[k], str):
j2[k] = j[k]
print(j2)
这导致:
{
'project_id': 'mystic-advice-090909',
'name': 'Mystic Advice',
'number': '999999999999',
'labels': {},
'status': 'ACTIVE',
'parent': None
}
注意:我的简单循环不处理本身就是字典的子项。您需要为这些情况添加额外的代码。示例 if isinstance(j[k], dict):
如果您想发挥创意,可以使用将对象转换为 JSON:
的方法扩展项目 classdef to_json(self):
j = self.__dict__
j2 = {}
for k in j:
if isinstance(j[k], dict):
j2[k] = j[k]
if isinstance(j[k], str):
j2[k] = j[k]
return j2
resource_manager.project.Project.to_json = to_json
client = resource_manager.Client()
for project in client.list_projects():
print(project.to_json())