文章目錄
simplejson
Python版的簡單、 快速、 可擴充 JSON 編碼器/解碼器
編碼基本的 Python 對象階層:
import simplejson as jsonprint 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 StringIOio = 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 jsonprint json.dumps([1 , 2, 3,{'4': 5, '6': 7}], separators=(',', ':'))
[1,2,3,{"4":5,"6":7}]
漂亮的輸出(輸出效果好看易讀,但是增加了很多空格,資料量變大):
import simplejson as jsons = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4 * ' ')print s
{ "4": 5, "6": 7}
解碼 JSON:
import simplejson as jsonprint json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')print json.loads('"\\"foo\\bar"')from StringIO import StringIOio = StringIO('["streaming API"]')print json.load(io)[0]
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]"fooarstreaming API
使用Decimal代替float類型:
import simplejson as jsonfrom decimal import Decimalprint 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 jsondef as_complex(dct): if '__complex__' in dct: return complex(dct['real'], dct['imag']) return dctprint json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
(1+2j)
把python的對象json編碼傳輸的json格式:
import simplejson as jsondef 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,整數早版本相容性也可以接受,轉換為字串,與很多空格。
如果指定,分隔字元應該是 (item_separator,dict_separator) 的元組。預設情況下,(',',': ') 使用。若要擷取的最緊湊的 JSON 表示形式,您應指定 (',',': ') 以消除空白。編碼是字元編碼為 str 執行個體,預設值為 ' utf-8'。default(obj) 是 obj 的一個函數,應返回一個可序列化版本或引發 TypeError。預設值只是引發 TypeError。若要使用一個自訂的 JSONEncoder 子類 (例如一個重寫要序列化的其他類型的 default () 方法),請使用 cls kwarg 指定。如果 use_decimal 為 true (預設值: True) 然後十進位。十進位將本機序列化為 JSON 完全精度 如果 namedtuple_as_object 為 true (預設: True),用 _asdict() 方法的對象將被編碼為 JSON 對象。如果 tuple_as_array 為 true (預設值: True),元組 (和子類) 將編碼為 JSON 數組。 如果 bigint_as_string 為 true (預設值: False),int' 2 ** 53 和高於或低於-2 ** 53 將作為字串進行編碼。這是為了避免舍入,否則在 Javascript 中發生。注意此選項丟失類型資訊,所以極端謹慎使用。如果 sort_keys 為 true (False),則輸出的詞典將排序的關鍵 ;這是有用的迴歸測試,以確保可以將 JSON 序列在日常基礎上進行比較。如果 item_sort_key 是可調用 (False),然後輸出的詞典將與它進行排序。可調用將使用像這樣: sorted(dct.items(),關鍵 = item_sort_key)。此選項將優先於 sort_keys。