【问题标题】:Google API python convert object to jsonGoogle API python将对象转换为json
【发布时间】:2021-02-26 02:51:27
【问题描述】:

在过去 5 年与 AWS 中的 Boto3 打交道后,我是 google apis 的新手。

我的问题是下面的代码sn-p:

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} <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 库编写得非常好并且易​​于使用的东西宠坏了。正在为此苦苦挣扎。

请指教,谢谢。

【问题讨论】:

    标签: google-cloud-platform google-api google-api-python-client


    【解决方案1】:

    除非您手动编写一些代码,否则您无法将类完全转换为 json。有些类有不可序列化的对象。

    资源管理器对象有一个字典属性__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):

    如果你想发挥创意,你可以扩展 Project 类,添加一个将对象转换为 JSON 的方法:

    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())
    

    【讨论】:

    • 谢谢你,我想,因为我得到了序列化错误。我试图找到一些轻量级的东西来转换,但没有骰子。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2018-10-11
    • 1970-01-01
    • 2016-02-13
    • 2022-01-17
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多