Python的数据交换?

0 投票
3 回答
541 浏览
提问于 2025-04-17 04:40

我刚开始学习Python,第一步是想创建一个网络服务。我打算用werkzeug来实现这个目标,不过我主要是想写一个客户端来和它对接。请问我该如何在这两个系统之间交换对象呢?Python有没有类似JSON的东西?

补充说明: 有几个人提到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

JSON不能表示任意的Python类。它只支持数字、字符串和字典。字典在JavaScript中其实和对象是一样的,但在Python中并不是。

如果你需要使用JSON,但又不能用pickle,因为你想把数据传给浏览器中的JavaScript,那么可以直接用json.dump()把你的对象转换成一个临时创建的字典:

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')

而且可能通过反射进一步改进这个过程。具体效果可能因情况而异。

4

从Python 2.6开始,它就自带了对JSON格式的支持,这个功能是通过一个叫做json的模块实现的。在这之前的版本,程序员们需要使用外部库来处理JSON,最常用的就是SimpleJson

1

听起来你想用pickle来代替json。pickle是Python特有的,可以处理用户自定义的类和字典:

>>> 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和YAML的规范,网址是 http://yaml.org

撰写回答