[英]How to parse nested EventGrid message?
我只是在了解由隊列存儲事件處理程序觸發的 Azure 函數。 在這種情況下,隊列存儲正在處理事件網格消息。
問題:如何使用 Python 訪問嵌套在下面"body"
中的各種值?
body/data/blobUrl
的值隊列存儲消息如下所示(縮進以便於閱讀):
"body"
是嵌套的 EventGrid 消息{
"id": "<big-long-guid>",
"body": "{
\"topic\":\"/subscriptions/<big-long-guid>/resourceGroups/azureStorage/providers/Microsoft.Storage/storageAccounts/stgcool\",
\"subject\":\"/blobServices/default/containers/cont-pics/blobs/profile_pic.jpg\",
\"eventType\":\"Microsoft.Storage.BlobCreated\",
\"id\":\"<big-long-guid>\",
\"data\":{
\"api\":\"PutBlob\",
\"clientRequestId\":\"<big-long-guid>\",
\"requestId\":\"<big-long-guid>\",
\"eTag\":\"0x8D94CE0B2F5CD71\",
\"contentType\":\"image/jpeg\",
\"contentLength\":35799,
\"blobType\":\"BlockBlob\",
\"blobUrl\":\"https://stgcool.blob.core.windows.net/cont-pics/profile_pic.jpg\",
\"url\":\"https://stgcool.blob.core.windows.net/cont-pics/profile_pic.jpg\",
\"sequencer\":\"00000000000000000000000000003730000000000000312a\",
\"storageDiagnostics\":{
\"batchId\":\"<big-long-guid>\"
}
},
\"dataVersion\":\"\",
\"metadataVersion\":\"1\",
\"eventTime\":\"2021-07-22T07:17:00.8479184Z\"
}",
"expiration_time": "2021-07-30T05:10:37+00:00",
"insertion_time": "2021-07-23T05:10:37+00:00",
"time_next_visible": "2021-07-23T05:20:37+00:00",
"pop_receipt": "cOQ8m5lN2QgBAAAA",
"dequeue_count": 1
}
以下是生成上述日志的示例函數代碼:
import logging
import json
import azure.functions as func
def main(msg: func.QueueMessage):
logging.info('Python queue trigger function processed a queue item.')
result = json.dumps({
'id': msg.id,
'body': msg.get_body().decode('utf-8'),
'expiration_time': (msg.expiration_time.isoformat()
if msg.expiration_time else None),
'insertion_time': (msg.insertion_time.isoformat()
if msg.insertion_time else None),
'time_next_visible': (msg.time_next_visible.isoformat()
if msg.time_next_visible else None),
'pop_receipt': msg.pop_receipt,
'dequeue_count': msg.dequeue_count
})
logging.info(result)
嘗試:
msg.get_body()
中的不同迭代get_json()
和json.dumps()
卻收到錯誤。編輯1:
將'body': msg.get_body().decode('utf-8'),
改為'body': json.loads(msg.get_body().decode('utf-8')),
將正文轉換為實際很好的 JSON。
但是我如何在結果中訪問['body']['data']['blobUrl'] in
呢?
type(result)
是str
我寫這篇文章的理解是,您正在嘗試更新您為logging
提供result
的方式。 如果您真正想做的是從構造不良的Queue Storage
消息中解析它,請告訴我。
鑒於您作為字典給出的示例:
d = {
"id": "<big-long-guid>",
"body": "{
\"topic\":\"/subscriptions/<big-long-guid>/resourceGroups/azureStorage/providers/Microsoft.Storage/storageAccounts/stgcool\",
\"subject\":\"/blobServices/default/containers/cont-pics/blobs/profile_pic.jpg\",
\"eventType\":\"Microsoft.Storage.BlobCreated\",
\"id\":\"<big-long-guid>\",
\"data\":{
\"api\":\"PutBlob\",
\"clientRequestId\":\"<big-long-guid>\",
\"requestId\":\"<big-long-guid>\",
\"eTag\":\"0x8D94CE0B2F5CD71\",
\"contentType\":\"image/jpeg\",
\"contentLength\":35799,
\"blobType\":\"BlockBlob\",
\"blobUrl\":\"https://stgcool.blob.core.windows.net/cont-pics/profile_pic.jpg\",
\"url\":\"https://stgcool.blob.core.windows.net/cont-pics/profile_pic.jpg\",
\"sequencer\":\"00000000000000000000000000003730000000000000312a\",
\"storageDiagnostics\":{
\"batchId\":\"<big-long-guid>\"
}
}",
\"dataVersion\":\"\",
\"metadataVersion\":\"1\",
\"eventTime\":\"2021-07-22T07:17:00.8479184Z\"
}",
"expiration_time": "2021-07-30T05:10:37+00:00",
"insertion_time": "2021-07-23T05:10:37+00:00",
"time_next_visible": "2021-07-23T05:20:37+00:00",
"pop_receipt": "cOQ8m5lN2QgBAAAA",
"dequeue_count": 1
}
我們可以像這樣查看"body"
中的值:
d['body']['data']['api']
PutBlob
不幸的是,如果您嘗試這樣做,您會因嘗試使用string
嘗試訪問另一個string
的索引而向您TypeError
。 我們使用string
對象作為dict
鍵,但不是string
索引。 你要拋出這樣的錯誤的原因是, "body"
“ dict
”,實際上是一個str
,而不是一個dict
(注意"
上大括號的兩側)。
通過更新'body'
json.dumps
來解決這個問題:
result = json.dumps({
'id': msg.id,
'body': json.loads(msg.get_body().decode('utf-8')),
...
編輯:
重讀你的問題,當你得到它時,我在你的例子中稱之為dict
東西似乎仍然是一個字符串。 在這種情況下,由於"body"
格式不正確,您可能會遇到更多問題。
如果是這種情況,您可以通過運行以下命令清除"body"
值周圍那些討厭的"
標記"body"
:
message = message.replace('"{', '{').replace('}"', '}')
在閱讀之前:
d = json.loads(message)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.