Python的数据交换?
我刚开始学习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