python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器
simplejson
Python版的简单、 快速、 可扩展 JSON 编码器/解码器
编码基本的 Python 对象层次结构:
import simplejson as json print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print json.dumps("\"foo\bar") print json.dumps(u'\u1234') print json.dumps('\\') print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) from StringIO import StringIO io = StringIO() json.dump(['streaming API'], io) io.getvalue()
["foo", {"bar": ["baz", null, 1.0, 2]}] "\"foo\bar" "\u1234" "\\" {"a": 0, "b": 0, "c": 0}
压缩编码(减少空格来节省数据传输量):
import simplejson as json print json.dumps([1 , 2, 3,{'4': 5, '6': 7}], separators=(',', ':'))
[1,2,3,{"4":5,"6":7}]
漂亮的输出(输出效果好看易读,但是增加了很多空格,数据量变大):
import simplejson as json s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4 * ' ') print s
{ "4": 5, "6": 7 }
解码 JSON:
import simplejson as json print json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') print json.loads('"\\"foo\\bar"') from StringIO import StringIO io = StringIO('["streaming API"]') print json.load(io)[0]
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}] "fooar streaming API
使用Decimal代替float类型:
import simplejson as json from decimal import Decimal print json.loads('1.1', use_decimal=True) == Decimal('1.1') print json.dumps(Decimal('1.1'), use_decimal=True) == '1.1'
True
True
json对象的解码成python对象:
import simplejson as json def as_complex(dct): if '__complex__' in dct: return complex(dct['real'], dct['imag']) return dct print json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
(1+2j)
把python的对象json编码传输的json格式:
import simplejson as json def encode_complex(obj): if isinstance(obj, complex): return [obj.real, obj.imag] raise TypeError(repr(o) + " is not JSON serializable") print json.dumps(2 + 1j, default=encode_complex) print json.JSONEncoder(default=encode_complex).encode(2 + 1j) print ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
[2.0, 1.0] [2.0, 1.0] [2.0, 1.0]
基本用法:
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, use_decimal=True, namedtuple_as_object=True, tuple_as_array=True, bigint_as_string=False, sort_keys=False, item_sort_key=None, **kw):
将 obj 序列化为 JSON 格式流到 fp (.write ()-支持类似于文件的对象)。
如果 skipkeys 为 true (默认: False),然后词典并不是一种基本类型的键 (str,unicode、 int,长、 浮动、 bool,None) 将被跳过而不是引发 TypeError。
如果 ensure_ascii 为 false (默认: True),然后写入 fp 一些块可能是 unicode 的情况下,除正常 Python str unicode 胁迫规则。除非 fp.write() 明确地理解 unicode (如 codecs.getwriter()) 这是可能会导致错误。它最好保留默认设置,因为它们是安全的,高度优化。
如果 check_circular 为 false (默认: True),容器类型的循环引用检查将被跳过,然后循环引用会导致更糟的OverflowError 。
如果 allow_nan 为 false (默认: True),那么它将是 ValueError 来序列化超过 float范围的值 (nan,inf、-inf) 中的 JSON 规范严格遵守。如果 allow_nan 为 true,则将使用对应的 JavaScript (NaN,无穷大,无穷大)。
如果indent缩进是一个字符串,然后 JSON 数组元素和对象成员将漂亮打印与换行符,其次是对于每个级别的嵌套重复该字符串。无 (默认值) 选择没有任何换行符的最紧凑的表示形式。为后仰与 simplejson 比 2.1.0,整数早版本兼容性也可以接受,转换为字符串,与很多空格。