PyCon 2011
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:liuyuan_jq
2011-03-30
json简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
json资源
http://www.json.org/json-zh.html
http://woodpecker.org.cn/diveintopython3/serializing.html
simplejson
如果你使用的是python2.6以下的版本,需要手动安装simplejson支持json
easy_install simplejson
自定义序列化对象
#!/usr/bin/env python# encoding: utf-8# json_myobj.py""" Define a class to be encoded."""class MyObj(object):def __init__(self, s):self.s = sdef __repr__(self):return '<MyObj(%s)>' % self.s
dumps操作
#!/usr/bin/env python# encoding: utf-8# json_dump_default.py"""Serialize a custom object to JSON."""import hmacimport json_myobjtry:import jsonexcept:import simplejson as json"""# python json_dump_default.py{"s" : "instance value goes here", "__module__" : "json_myobj", "__signature__": "426f662f9fe3b3533d9ce7f9dcf8af77", "__class__" : "MyObj"}"""def convert_to_builtin_type(obj):"""object->dictionary"""print 'convert_to_builtin_type(%r)' % obj# convert_to_builtin_type(<MyObj(instance value goes here)>)class_name = obj.__class__.__name__module_name = obj.__module__digest_maker = hmac.new('PyCon2011', # 公钥module_name + class_name) # 发送的信息signature = digest_maker.hexdigest() # 生成摘要d = { '__class__':class_name,'__module__':module_name,'__signature__':signature,}d.update(obj.__dict__)return dobj = json_myobj.MyObj('instance value goes here')print json.dumps(obj, default=convert_to_builtin_type)
loads操作
#!/usr/bin/env python# encoding: utf-8"""Load a custom object from JSON serlized version."""import hmactry:import jsonexcept:import simplejson as jsondef dict_to_object(d): if '__class__' not in d: return dclass_name = d.pop('__class__')module_name = d.pop('__module__')signature = d.pop('__signature__')digest_maker = hmac.new('PyCon2011', module_name + class_name)expected_signature = digest_maker.hexdigest()if signature != expected_signature:raise ValueError('Invalid signature')print 'Loading "%s" from "%s"' % \(class_name, module_name)module = __import__(module_name)class_ = getattr(module, class_name)args = dict( (key.encode('ascii'), value)for key, value in d.items())print 'Instantiating with', argsinst = class_(**args)return instfor encoded_object in ['''[{"s": "instance value goes here","__signature__": "426f662f9fe3b3533d9ce7f9dcf8af77","__module__": "json_myobj", "__class__": "MyObj"}]''',# careful!'''[{"path": "/etc/passwd","__signature__": "426f662f9fe3b3533d9ce7f9dcf8af77","__module__": "os", "__class__": "unlink"}]''',]:try:myobj_instance = json.loads(encoded_object, object_hook=dict_to_object,)print myobj_instanceexcept Exception, err:print 'ERROR:', errprint
页:
[1]