簡體   English   中英

如何解析嵌套的 EventGrid 消息?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM