获取AttributeError解析JSON数据

2024-09-27 07:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我从服务器获取一个JSON数据,我需要单独解析它,当我使用SimpleNamespace执行此操作时,我遇到了问题。如何解析这些数据

示例数据:

{
  "version":"1.0",
  "packageName":"com.some.thing",
  "eventTimeMillis":"1503349566168",
  "subscriptionNotification":
  {
    "version":"1.0",
    "notificationType":4,
    "purchaseToken":"PURCHASE_TOKEN",
    "subscriptionId":"my.sku"
  }
}

我的代码:

import json
from types import SimpleNamespace

def callback(message):
    x = json.loads(message.data, object_hook=lambda d: SimpleNamespace(**d))
    
    print("Version: " + x.version)
    print("Package Name: " + x.packageName)
    print("Time Milis: " + x.eventTimeMillis)
    print("Token: " + x.subscriptionNotification.purchaseToken)
    print("Product: " + x.subscriptionNotification.subscriptionId)
    print("Type: " + str(x.subscriptionNotification.notificationType))

错误:

AttributeError: 'types.SimpleNamespace' object has no attribute 'subscriptionNotification'

Tags: 数据importjsonmessageobjectversiontypespackagename
1条回答
网友
1楼 · 发布于 2024-09-27 07:30:53

在本例中,我们从一本字典开始。从那时起,代码很少,整个过程变成了“表驱动”。例如,如果您的字典结构发生更改,以至于您向顶层添加了一个新键,那么您只需要对L1表进行相应的更改。希望这将为您提供一些关于如何继续的想法:

D = {
    "version": "1.0",
    "packageName": "com.some.thing",
    "eventTimeMillis": "1503349566168",
    "subscriptionNotification":
    {
        "version": "1.0",
        "notificationType": 4,
        "purchaseToken": "PURCHASE_TOKEN",
        "subscriptionId": "my.sku"
    }
}


def doPrint(d, L):
    if d:
        for _l in L:
            print(f'{_l[0]}: {d.get(_l[1], "n/a")}')


L1 = [['Version', 'version'],
    ['Package Name', 'packageName'],
    ['Time Millis', 'eventTimeMillis']
]
L2 = [['Token', 'purchaseToken'],
    ['Product', 'subscriptionId'],
    ['Type', 'notificationType']
]

doPrint(D, L1)
doPrint(D.get('subscriptionNotification', None), L2)

相关问题 更多 >

    热门问题