Python的数据交换?

时间:2011-10-20 05:47:52

标签: python json

刚开始使用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);

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

听起来你正在寻找使用pickle而不是json - pickles是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规范

答案 2 :(得分:0)

json不能代表任意的python类。它支持数字,字符串和dicts。后者实际上与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。