【问题标题】:Getting AttributeError parsing JSON data获取 AttributeError 解析 JSON 数据
【发布时间】:2021-11-25 21:54:08
【问题描述】:

我从服务器获取 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'

【问题讨论】:

  • 我根据您的示例数据尝试了您的代码,没有任何问题。我怀疑传递给 callback()message 与您想象的不太一样。在 callback() 中尝试 print(message)
  • @BrutusForcus 是的,有时一些混合数据来自服务器,因此它崩溃了。这段代码通常可以正常工作,但有时我会出错,所以我想以不同的方式来做。如何在 SimpleNamespace 之外执行此操作?
  • 不要使用 SimpleNamespace - 即,省略 object_hook。然后,要访问密钥,最好使用带有默认值的传统 get() - 例如,'n/a' 或 None
  • @BrutusForcus 尝试此操作时出现错误。 x = json.loads(message.data) 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: 'dict' object has no attribute 'version'
  • 这并不奇怪。我建议你使用 get() 但你决定反对这个建议

标签: python json parsing


【解决方案1】:

在本例中,我们从字典开始。从那时起,代码就很少了,整个事情就变成了“表驱动”。例如,如果您的字典结构发生更改,因此您向顶层添加了一个新键,那么您只需对 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)

【讨论】:

  • 您的代码可以工作,谢谢,但我无法让它在我的系统上工作。你能帮忙吗?我在 def 回调(消息)中获取数据
  • def callback(message): D = json.loads(message.data) print(D) 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)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多