我正在使用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吗?
我怀疑Asset
是一个协议缓冲区消息,并且(这些类(不可JSON序列化。
注意确认
Asset
是协议缓冲区。该方法使用gRPC代码转换,请参阅assets.list
您应该(!(能够使用google.protobuf.json_format中的
MessageToJSON
将protobuf消息转换为json,然后可以将其转换为CSV。该模块还包括MessageToDict
,在这种情况下可能(!?(更可取
更新
显然(!(谷歌已经改变了对API客户端库的Protobuf支持,并将Proto Plus用于Python。直到你的问题我才知道。现在的解决方案是(!(:
for asset in resp:
j = asset_v1.Asset.to_json(asset)
而且,IIUC,因为您需要to_json
协议缓冲区消息,所以您需要迭代resp
、to_json
每个(!?(asset
,然后在转换为CSV之前重新组装它们。
注意当我怀疑您真的想序列化响应的
assets
属性(Asset
列表(时,您的代码会出现(!?(,将响应中的每个Asset
创建为一个单独的CSV文件(list.csv
(。