Python处理JSON
print "MODULE:",module
class_ = getattr(module,class_name)
print "CLASS",class_
args = dict((key.encode('ascii'),value) for key,value in d.items())
print 'INSTANCE ARGS:',args
'__module__':obj.__module__, } d.update(obj.__dict__) return d
print json.dumps(obj, default=convert_to_builtin_type)
输出:
ERROR: <MyObj(helloworld)> is not JSON serializable default( <MyObj(helloworld)> ) {"s": "hellworld", "__module__": "MyObj", "__class__": "__main__"} #注意:这里的 class 和 module 根据你代码的所在文件位置不同而不同
repr(data)
: 35
dumps(data)
: 35
dumps(data, indent=2) : 76
dumps(data, separators): 29
skipkeys 参数,在 encoding 过程中,dict 对象的 key 只可以是 string 对象,如果是其他类 型,那么在编码过程中就会抛出 ValueError 的异常。skipkeys 可以跳过那些非 string 对象 当作 key 的处理.
except TypeError, err: print 'ERROR:', err
#转换函数 def convert_to_builtin_type(obj):
print 'default(', repr(obj), ')' # 把 MyObj 对象转换成 dict 类型的对象 d = { '__class__':obj.__class__.__name__,
相反,如果要把 json decode 成 python 对象,同样也需要自定转换函数,传递给 json.loads 方法的 object_hook 参数:
#jsontest.py
import json
class MyObj(object):
def __init__(self,s): surn "<MyObj(%s)>" % self.s
def dict_to_object(d): if '__class__' in d: class_name = d.pop('__class__') module_name = d.pop('__module__') module = __import__(module_name)
输出:
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}] SORT: [{"a": "A", "b": [2, 4], "c": 3.0}
indent 参数根据数据格式缩进显示,读起来更加清晰:
输出:
DATA: [{'a':'A','c':3.0,'b':(2,4)}] #python 的 dict 类型的数据是没有顺序存储的 JSON: [{"a":"A","c":3.0,"b":[2,4]}]
JSON 的输出结果与 DATA 很相似,除了一些微妙的变化,如 python 的元组类型变成了 Json 的数组,Python 到 Json 的编码转换规则是:
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ] print 'DATA:', repr(data)
unsorted = json.dumps(data) print 'JSON:', json.dumps(data) print 'SORT:', json.dumps(data, sort_keys=True)
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ] print 'DATA:', repr(data)
print 'NORMAL:', json.dumps(data, sort_keys=True) print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)
import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)
:', len(repr(data))
print 'dumps(data)
:', len(json.dumps(data))
输出:
MODULE: <module 'jsontest' from 'E:\Users\liuzhijun\workspace\python\jsontest.py'> CLASS <class 'jsontest.MyObj'> INSTANCE ARGS: {'s': u'helloworld'} [<MyObj(helloworld)>] MODULE: <module 'jsontest' from 'E:\Users\liuzhijun\workspace\python\jsontest.py'>
print print json.dumps(data, skipkeys=True)
输出:
ERROR: keys must be a string
[{"a": "A", "c": 3.0, "b": [2, 4]}]
让 json 支持自定义数据类型
以上例子都是基于 python 的 built-in 类型的,对于自定义类型的数据结构,json 模块默认是 没法处理的,会抛出异常:TypeError xx is not JSON serializable ,此时你需要自定义一 个转换函数:
解码过程中,json 的数组最终转换成了 python 的 list,而不是最初的 tuple 类型,Json 到 Python 的解码规则是:
json 的人文关怀
编码后的 json 格式字符串紧凑的输出,而且也没有顺序,因此 dumps 方法提供了一些可选 的参数,让输出的格式提高可读性,如 sort_keys 是告诉编码器按照字典排序(a 到 z)输出。
概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程, 传输的格式可以是 JSON、XML 等。反序列化就是从存储区域(JSON,XML)读取反序列 化对象的状态,重新创建该对象。 JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于 XML 而言更 简单,也易于阅读和编写,机器也方便解析和生成,Json 是 JavaScript 中的一个子集。 Python2.6 开始加入了 JSON 模块,无需另外下载,Python 的 Json 模块序列化与反序列化 的过程分别是 encoding 和 decoding encoding:把一个 Python 对象编码转换成 Json 字符串 decoding:把 Json 格式字符串解码转换成 Python 对象 对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。
import json
data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
try: print json.dumps(data)
except (TypeError, ValueError) as err: print 'ERROR:', err
decoded = json.loads(data_string) print "DECODED:",decoded
print "ORIGINAL:",type(data[0]['b']) print "DECODED:",type(decoded[0]['b'])