我正在尝试将 JSON 加载回对象中。“加载”方法似乎可以正常工作,但该对象似乎没有我期望的属性。
我该如何检查/检查我拥有的对象(这是基于 Web 的代码)。
results = {"Subscriber": {"firstname": "Neal", "lastname": "Walters"}}
subscriber = json.loads(results)
for item in inspect.getmembers(subscriber):
self.response.out.write("<BR>Item")
for subitem in item:
self.response.out.write("<BR> SubItem=" + subitem)
上面的尝试返回了这个:
Item
SubItem=__class__
我认为这并不重要,但对于上下文:JSON 实际上来自 Google App Engine 中的 urlfetch 到使用此实用程序创建的 rest web 服务: http ://code.google.com/p/appengine-rest-服务器。正在使用以下定义从数据存储中检索数据:
class Subscriber(db.Model):
firstname = db.StringProperty()
lastname = db.StringProperty()
谢谢,尼尔
更新#1:基本上我试图将 JSON 反序列化回一个对象。理论上它是从一个对象序列化的,我现在想把它放回一个对象中。也许更好的问题是如何做到这一点?
更新#2:我试图将一个复杂的程序抽象为几行代码,所以我在“伪编码”中犯了一些错误,以便在此处发布。
这是一个更好的代码示例,现在从我可以在 PC 上运行的网站中取出。
results = '{"Subscriber": {"firstname": "Neal", "lastname": "Walters"}}'
subscriber = json.loads(results)
for key, value in subscriber.items():
print " %s: %s" %(key, value)
上面的运行,它显示的内容看起来并不比 JSON 字符串本身更结构化。它显示:订阅者:{u'lastname': u'Walters', u'firstname': u'Neal'}
我有更多的微软背景,所以当我听到序列化/反序列化时,我想从一个对象到一个字符串,然后从一个字符串回到一个对象。因此,如果我序列化为 JSON,然后反序列化,我会得到什么,字典、列表或对象?实际上,我从 REST webmethod 获取 JSON,这是代表我为我序列化我的对象。
理想情况下,我想要一个与上面的订阅者类匹配的订阅者对象,理想情况下,我不想编写一次性自定义代码(即特定于“订阅者”的代码),因为我想做同样的事情与其他数十个课程。如果我必须编写一些自定义代码,我将需要通用地编写它,以便它适用于任何类。
更新#3:这是为了解释更多为什么我认为这是一个必要的工具。我正在编写一个巨大的应用程序,可能在 Google App Engine (GAE) 上。我们倾向于 REST 架构有几个原因,但其中一个原因是我们的 Web GUI 应该通过 REST Web 层访问数据存储。(我更习惯于 SOAP,所以切换到 REST 本身就是一个小挑战)。因此,获取和更新数据的经典方法之一是通过业务或数据层。通过使用上面提到的 REST 实用程序,我可以选择 XML 或 JSON。我希望在我们开发大型应用程序之前做一个小型的工作原型)。然后,假设我们有一个成功的应用程序,GAE 将它的价格翻了一番。然后我们可以只重写数据层,使用我们的 Python/Django 用户层(Web 代码),并在 Amazon 或其他地方运行它。
如果我要做所有这些,为什么我希望一切都是字典对象。我不想拥有成熟的阶级结构的力量吗?接下来的技巧之一是某种对象关系映射 (ORM),因此我们不必公开我们的确切数据表,而是更多的逻辑层。
我们还希望向可能使用任何语言的付费用户公开一个 RESTful API。对于他们来说,他们可以使用 XML 或 JSON,他们不会使用这里讨论的序列化例程。