【发布时间】: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() 但你决定反对这个建议