我想在云存储的json文件中编写一个警报策略列表。我有下面的脚本:
def my_function(request):
alert_client = monitoring_v3.AlertPolicyServiceClient()
storage_client = storage.Client()
project_name = 'projects/my_project'
bucket_name = 'test'
policies = alert_client.list_alert_policies(name=project_name)
for policy in policies:
print(policy)
destination_blob_name = 'test'
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(destination_blob_name)
blob.upload_from_string("{}".format(json.dumps(policy)))
此脚本不起作用,并返回以下错误:TypeError: Object of type AlertPolicy is not JSON serializable"
现在有两件事:
- 使用API资源管理器或查看此文档,列表方法的响应应该很容易处理。然而,我正在用Python编写我的云函数,结果似乎有所不同
- 我知道分页的处理方式有一些问题,但我不知道如何处理
- 我可以
print(policies)
,但日志输出有点奇怪,json对象的每个元素都有一行。为什么?这是什么意思 - 我该如何处理此响应?这里有通用方法吗?或者这是API特有的方法吗
- 我仍然可以独立访问每个变量
policy.name
、policy.conditions
等…这是否意味着我必须手动重建我想要的json对象
根据警报策略服务的googleapi文档,使用list_alert_policies()
迭代警报策略列表会自动解析响应的后续页面。您不应该担心根据文档实现分页逻辑:
返回:ListAlertPolicy响应的协议。对此对象进行迭代将产生结果并自动解析其他页面。源
对于类型AlertPolicy
,它似乎无法在本机上转换为JSON。您可能必须通过调用返回的AlertPolicy
对象的相应属性来构建JSON对象,或者您也可以实现类似于ProtoEncoder
类的东西,该类似乎从AlertPolicy
类型返回JSON。关于AlertPolicy
对象上的可用属性,这里是源。
class ProtoEncoder(json.JSONEncoder):
"""Encode protobufs as json."""
def default(self, obj):
if type(obj) in (monitoring_v3.AlertPolicy, monitoring_v3.NotificationChannel):
text = proto.Message.to_json(obj)
return json.loads(text)
return super(ProtoEncoder, self).default(obj)