写入和读取 json 数据云函数和云存储

Write and read json data cloud functions and cloud storage

我有第一个云函数,我正在其中写入来自云存储中 API 的响应:

  api_response = service.accounts().api().execute()
  bucket_name = 'my_bucket'
  date = datetime.today().strftime('%Y-%m-%d %H:%M:%S')
  bucket = storage_client.bucket(bucket_name)
  destination_blob_name = 'stuff_here/{}'.format(date)
  blob = bucket.blob(destination_blob_name)
  blob.upload_from_string("{}".format(api_response))

当我在云存储中查看我的文件时,我有这样的东西:

{'items': [
{'path': 'foo/12066407/stuff/12396182', 'accountId': '34858', 'containerId': '475663', 'name': 'blablabla', 'usageContext': ['stuff'], 'fingerprint': '1621433559139', 'Url': 'https://randomurl.com/#/randomPath/path/12066407/id?apiLink=blabla'}]}

我这里的数组中只有一个对象作为示例。所有对象在实际用例中都是一致的

然后我希望能够从另一个云功能读取这个文件。

我有以下代码:

bucket = client.get_bucket('my_bucket')
blob = bucket.get_blob('filename')
content = blob.download_as_string().decode()
print(StringIO(content))
print(json.dumps(content))
my_df = pd.read_json(StringIO(content))

对于第一张印刷品,我有 Content: <_io.StringIO object at 0x3ef722b287d0>。对于第二次打印,我复制了我的文件中的内容,当我试图在 df 中传递它时,出现以下错误 ValueError: Expected object or value.

最终我希望能够提取其中一个键值对。

我应该在第一个函数中以不同的方式编写 API 的结果,还是如何用第二个函数读取它?

很多事情。

首先,StringIO return一个可以读写的对象。所以,如果你打印对象,你在输出中有内存引用,那完全没问题。

然后,您有一个要在 JSON 中解析的字符串。您必须使用 json.loads(content) 而不是转储(转储用于以 JSON 格式将字典写入字符串)。

最后,JSON 如果您的文件(在云存储中)看起来很奇怪:键和值必须有双引号,而您的示例中只有单引号。您不能在代码中加载损坏的 JSON,请确保 API 答案在写入 GCS 之前是有效的 JSON。