【问题标题】:Data exchange for Python?Python的数据交换?
【发布时间】:2011-10-20 05:47:52
【问题描述】:

刚刚开始使用 Python,但第一个目标是创建 Web 服务。我计划为此使用 werkzeug,但是,我要做的就是编写一个客户端来与之交互。我将如何在两个系统之间交换对象?有没有类似 JSON for Python 的东西?

编辑: 几次提到 JSON,但我的主要问题是我不能序列化一个类?我有点认为这就是 JSON 可以做的事情?

class User():
    def __init__(self, first, last, age):
        self.first = first
        self.last = last
        self.age = age

user = User("John", "Doe", 25)
json.dumps(user)

TypeError: <__main__.User instance at 0x02ABBEE0> is not JSON serializable

我知道你在 JSON 中序列化的东西不一定是一个类,它是一个对象,但你仍然可以几乎像这样引用它:

    var mailingAddress = { 
     "Address"    :   "123 Anywhere St.", 
     "City"       :   "Springfield", 
     "PostalCode" :   99999
};
alert("The package will be shipped to postal code " + mailingAddress.PostalCode);

【问题讨论】:

  • 仅供参考:JSON 与语言无关,尽管它的名称。向下滚动到json.org 的底部,可以看到很多语言都有 JSON 库。 :)
  • 您的单独问题应该是单独的问题。

标签: python json


【解决方案1】:

Python 从 2.6 开始就通过 json 模块支持原生 JSON。以前的版本必须使用外部库,SimpleJson 是最常见的。

【讨论】:

    【解决方案2】:

    听起来您希望使用 pickle 而不是 json —— pickle 是 Python 特定的,但可以处理用户类和 dicts:

    >>> class User():
        def __init__(self, first, last, age):
            self.first = first
            self.last = last
            self.age = age
    
    >>> user = User("John", "Doe", 25)
    >>> import pickle
    >>> s = pickle.dumps(user)
    >>> del user
    >>> user = pickle.loads(s)    # reconstruct the object
    >>> print vars(user)
    {'age': 25, 'last': 'Doe', 'first': 'John'}
    

    如果您需要独立于语言的变体,请查看 PyYAML 和 http://yaml.org 的 YAML 规范

    【讨论】:

    • 正是我需要的,谢谢。 Pickle 有效,但更重要的是,最终我计划添加一个 API,所以也许我想看看 YAML。
    【解决方案3】:

    json 不能代表任意 python 类。它支持数字、字符串和字典。后者实际上与 javascript 中的对象相同,但它不在 python 中。

    如果你需要 JSON 并且不能使用 pickle,因为你想在浏览器中传递给 javascript,只需 json.dump() 一个从你的对象动态组成的 dict:

    json.dumps({
        'first': user.first,
        'last': user.last,
        'age': user.age,
    })
    

    如果你愿意,你可以创建助手来减少一些重复。

    def dumpObject(obj, *properties):
        data = dict((p, getattr(obj, p)) for p in properties)
        return json.dumps(data)
    
    dumpObject(user, 'first,' 'last', 'age')
    

    并且可能通过反思进一步改进这一点。 YMMV。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多