在Python中使用JSON
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.org
語法
結構
JSON只提供了兩種結構——字典和數組。也就是說,JSON可以存儲一對一或者一對多的鍵值對關係。
形式
對象
對象是一個無序的鍵值對集合。 一個對象以{
開始,}
結束。每個鍵
後跟一個:
;鍵值對之間使用,
分隔。
數組
數組是值的有序集合,一個鍵可以對應一個數組。 一個數組以[
開始,]
結束。值之間使用,
分隔。
值
值可以是雙引號括起來的字符串、數值、true、false、 null、對象或者數組。這些結構可以嵌套。
字符串
字符串是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符即一個單獨的字符串。 字符串與C/C++中的字符串非常相似,包括常見的各種轉義符號。
數值
數值與C/C++中的數值非常相似,但沒有八進制和十六進制格式。
空白
空白符號(包括空格,Tab以及回車)可以加入到任何符號之間,不會影響JSON的含義
Python中的JSON庫
以Python 3爲基準
編碼
對應類型
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
函數
我們使用JSON
庫中的dump
以及dumps
函數來進行JSON
編碼。dump
和dumps
各項參數含義基本一致,唯一區別在於dump
函數編碼產生一個JSON文件流,而dumps
編碼產生一個JSON字符串。
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
obj
:編碼對象fp
:指定文件流skipkeys
:若skipkeys爲真,則非標準類型將會跳過;否則返回TypeError
ensure_ascii
:若ensure_ascii
爲真,則輸出時將會確保沒有非ASCII字符;否則將會原樣輸出check_circular
:若check_circular
爲真,則將會檢測是否存在循環調用;否則會跳過檢測allow_nan
:若allow_nan
爲真,則將會允許存在空值(無窮大值);否則會返回ValueError
cls
:若cls
爲空值,則使用JSONEncoder
;否則使用指定子類進行編碼indent
:若indent
爲空值,則無縮進;否則使用指定值進行縮進separators
:若separators
爲空值,則使用(',', ': ')
分隔;否則使用指定的元組進行分隔default
:若default
爲空值,則使用自帶的default
方法;否則使用指定值sort_keys
:若sort_keys
爲真,則輸出將會按照鍵進行排序
示範
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
# 排序
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
# 分隔符
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
# Unicode輸出
>>> json.dumps("\u5317\u4eac", ensure_ascii=False)
'北京'
解碼
對應類型
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
函數
我們使用JSON
庫中的load
以及loads
函數來進行JSON
解碼。load
和loads
各項參數含義基本一致,唯一區別在於load
函數用於解碼JSON文件流,而loads
用於解碼JSON字符串。
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
fp
:指定文件流s
:指定字符串encoding
:指定字符串編碼cls
:若cls
爲空值,則使用JSONEncoder
;否則使用指定子類進行編碼object_hook
:若object_hook
爲空值,對象則返回解碼器dict
;否則使用自定義類型返回parse_float
:若parse_float
爲空,則JSON浮點數轉換爲浮點數;否則轉換爲指定類型parse_int
:若parse_int
爲空,則JSON整數轉換爲整數;否則轉換爲指定類型parse_constant
若parse_constant
爲空,則不會處理非法輸入;否則拋出異常object_pairs_hook
:若object_pairs_hook
爲空值,則數組返回解碼器dict
;否則使用自定義類型返回
示範
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]