python 类型为Asset的对象不可进行JSON序列化

jjhzyzn0  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(130)

我正在使用GCP的Python客户端API来列出云资产。我需要将输出移动到CSV文件。但我不能,因为它显示
TypeError:类型为Asset的对象不可JSON序列化
我的代码

response = client.list_assets(
  request={
    "parent": project_resource,
    "read_time": None,
    "asset_types": ["compute.googleapis.com/Instance"],
    "content_type": asset_v1.ContentType.RESOURCE,
    "page_size": 50,
  }
)

for asset in response:
   print(asset)
df = json_normalize(asset)
df.to_csv('list.csv', sep=',', encoding='utf-8')`

我的输出

TypeError: Object of type Asset is not JSON serializable

我是否需要使用任何其他库文件来转换为CSV?

beq87vna

beq87vna1#

我怀疑Asset是一个协议缓冲区消息,并且(这些类)不是JSON可序列化的。

    • 注意**已确认Asset是协议缓冲区。该方法使用gRPC代码转换,请参见assets.list

您应该(!)能够在google.protobuf.json_format中使用MessageToJSON将protobuf消息转换为JSON,然后再转换为CSV。该模块还包括MessageToDict,在这种情况下可能(!?)更可取。

更新

显然(!)谷歌已经改变了API客户端库的Protobuf支持,并使用Proto Plus for Python。直到你的问题,我才知道这一点。解决方案是现在(!):

for asset in resp:
    j = asset_v1.Asset.to_json(asset)

而且,IIUC,因为您需要to_json协议缓冲区消息,所以您将需要在respto_json和每个(!?)asset上迭代,然后在转换为CSV之前重新组装它们。

    • 注意**您的代码显示(!?)将响应中的每个Asset创建为单独的CSV文件(list.csv),而我怀疑您确实希望序列化响应的assets属性(Asset列表)。

相关问题