json --- JSON 編碼和解碼器?

源代碼: Lib/json/__init__.py


JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 4627) and by ECMA-404, is a lightweight data interchange format inspired by JavaScript object literal syntax (although it is not a strict subset of JavaScript 1 ).

json 提供了與標(biāo)準(zhǔn)庫(kù) marshalpickle 相似的API接口。

對(duì)基本的 Python 對(duì)象層次結(jié)構(gòu)進(jìn)行編碼:

>>>
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'

緊湊編碼:

>>>
>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'

美化輸出:

>>>
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}

JSON解碼:

>>>
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']

特殊 JSON 對(duì)象解碼:

>>>
>>> import json
>>> def as_complex(dct):
...     if '__complex__' in dct:
...         return complex(dct['real'], dct['imag'])
...     return dct
...
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
...     object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')

擴(kuò)展 JSONEncoder

>>>
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
...     def default(self, obj):
...         if isinstance(obj, complex):
...             return [obj.real, obj.imag]
...         # Let the base class default method raise the TypeError
...         return json.JSONEncoder.default(self, obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']

從命令行使用 json.tool 來(lái)驗(yàn)證并美化輸出:

$ echo '{"json":"obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

詳細(xì)文檔請(qǐng)參見(jiàn) 命令行界面。

備注

JSON 是 YAML 1.2 的一個(gè)子集。由該模塊的默認(rèn)設(shè)置生成的 JSON (尤其是默認(rèn)的 “分隔符” 設(shè)置值)也是 YAML 1.0 and 1.1 的一個(gè)子集。因此該模塊也能夠用于序列化為 YAML。

備注

這個(gè)模塊的編碼器和解碼器默認(rèn)保護(hù)輸入和輸出的順序。僅當(dāng)?shù)讓拥娜萜魑磁判驎r(shí)才會(huì)失去順序。

基本使用?

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)?

使用這個(gè) 轉(zhuǎn)換表obj 序列化為 JSON 格式化流形式的 fp (支持 .write()file-like object)。

如果 skipkeys 是 true (默認(rèn)為 False),那么那些不是基本對(duì)象(包括 str, intfloat、boolNone)的字典的鍵會(huì)被跳過(guò);否則引發(fā)一個(gè) TypeError

json 模塊始終產(chǎn)生 str 對(duì)象而非 bytes 對(duì)象。因此,fp.write() 必須支持 str 輸入。

如果 ensure_ascii 是 true (即默認(rèn)值),輸出保證將所有輸入的非 ASCII 字符轉(zhuǎn)義。如果 ensure_ascii 是 false,這些字符會(huì)原樣輸出。

If check_circular is false (default: True), then the circular reference check for container types will be skipped and a circular reference will result in a RecursionError (or worse).

如果 allow_nan 是 false(默認(rèn)為 True),那么在對(duì)嚴(yán)格 JSON 規(guī)格范圍外的 float 類(lèi)型值(naninf-inf)進(jìn)行序列化時(shí)會(huì)引發(fā)一個(gè) ValueError。如果 allow_nan 是 true,則使用它們的 JavaScript 等價(jià)形式(NaN、Infinity-Infinity)。

如果 indent 是一個(gè)非負(fù)整數(shù)或者字符串,那么 JSON 數(shù)組元素和對(duì)象成員會(huì)被美化輸出為該值指定的縮進(jìn)等級(jí)。 如果縮進(jìn)等級(jí)為零、負(fù)數(shù)或者 "",則只會(huì)添加換行符。 None (默認(rèn)值) 選擇最緊湊的表達(dá)。 使用一個(gè)正整數(shù)會(huì)讓每一層縮進(jìn)同樣數(shù)量的空格。 如果 indent 是一個(gè)字符串 (比如 "\t"),那個(gè)字符串會(huì)被用于縮進(jìn)每一層。

在 3.2 版更改: 現(xiàn)允許使用字符串作為 indent 而不再僅僅是整數(shù)。

當(dāng)被指定時(shí),separators 應(yīng)當(dāng)是一個(gè) (item_separator, key_separator) 元組。當(dāng) indentNone 時(shí),默認(rèn)值取 (', ', ': '),否則取 (',', ': ')。為了得到最緊湊的 JSON 表達(dá)式,你應(yīng)該指定其為 (',', ':') 以消除空白字符。

在 3.4 版更改: 現(xiàn)當(dāng) indent 不是 None 時(shí),采用 (',', ': ') 作為默認(rèn)值。

當(dāng) default 被指定時(shí),其應(yīng)該是一個(gè)函數(shù),每當(dāng)某個(gè)對(duì)象無(wú)法被序列化時(shí)它會(huì)被調(diào)用。它應(yīng)該返回該對(duì)象的一個(gè)可以被 JSON 編碼的版本或者引發(fā)一個(gè) TypeError。如果沒(méi)有被指定,則會(huì)直接引發(fā) TypeError。

如果 sort_keys 是 true(默認(rèn)為 False),那么字典的輸出會(huì)以鍵的順序排序。

為了使用一個(gè)自定義的 JSONEncoder 子類(lèi)(比如:覆蓋了 default() 方法來(lái)序列化額外的類(lèi)型), 通過(guò) cls 關(guān)鍵字參數(shù)來(lái)指定;否則將使用 JSONEncoder。

在 3.6 版更改: 所有可選形參現(xiàn)在都是 僅限關(guān)鍵字參數(shù)。

備注

picklemarshal 不同,JSON 不是一個(gè)具有框架的協(xié)議,所以嘗試多次使用同一個(gè) fp 調(diào)用 dump() 來(lái)序列化多個(gè)對(duì)象會(huì)產(chǎn)生一個(gè)不合規(guī)的 JSON 文件。

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)?

使用這個(gè) 轉(zhuǎn)換表obj 序列化為 JSON 格式的 str。 其參數(shù)的含義與 dump() 中的相同。

備注

JSON 中的鍵-值對(duì)中的鍵永遠(yuǎn)是 str 類(lèi)型的。當(dāng)一個(gè)對(duì)象被轉(zhuǎn)化為 JSON 時(shí),字典中所有的鍵都會(huì)被強(qiáng)制轉(zhuǎn)換為字符串。這所造成的結(jié)果是字典被轉(zhuǎn)換為 JSON 然后轉(zhuǎn)換回字典時(shí)可能和原來(lái)的不相等。換句話(huà)說(shuō),如果 x 具有非字符串的鍵,則有 loads(dumps(x)) != x。

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)?

使用這個(gè) 轉(zhuǎn)換表fp (一個(gè)支持 .read() 并包含一個(gè) JSON 文檔的 text file 或者 binary file) 反序列化為一個(gè) Python 對(duì)象。

object_hook 是一個(gè)可選的函數(shù),它會(huì)被調(diào)用于每一個(gè)解碼出的對(duì)象字面量(即一個(gè) dict)。object_hook 的返回值會(huì)取代原本的 dict。這一特性能夠被用于實(shí)現(xiàn)自定義解碼器(如 JSON-RPC 的類(lèi)型提示)。

object_pairs_hook 是一個(gè)可選的函數(shù),它會(huì)被調(diào)用于每一個(gè)有序列表對(duì)解碼出的對(duì)象字面量。 object_pairs_hook 的返回值將會(huì)取代原本的 dict 。這一特性能夠被用于實(shí)現(xiàn)自定義解碼器。如果 object_hook 也被定義, object_pairs_hook 優(yōu)先。

在 3.1 版更改: 添加了對(duì) object_pairs_hook 的支持。

parse_float ,如果指定,將與每個(gè)要解碼 JSON 浮點(diǎn)數(shù)的字符串一同調(diào)用。默認(rèn)狀態(tài)下,相當(dāng)于 float(num_str) 。可以用于對(duì) JSON 浮點(diǎn)數(shù)使用其它數(shù)據(jù)類(lèi)型和語(yǔ)法分析程序 (比如 decimal.Decimal )。

parse_int ,如果指定,將與每個(gè)要解碼 JSON 整數(shù)的字符串一同調(diào)用。默認(rèn)狀態(tài)下,相當(dāng)于 int(num_str) ??梢杂糜趯?duì) JSON 整數(shù)使用其它數(shù)據(jù)類(lèi)型和語(yǔ)法分析程序 (比如 float )。

parse_constant ,如果指定,將要與以下字符串中的一個(gè)一同調(diào)用: '-Infinity' , 'Infinity' , 'NaN' 。如果遇到無(wú)效的 JSON 數(shù)字則可以使用它引發(fā)異常。

在 3.1 版更改: parse_constant 不再調(diào)用 'null' , 'true' , 'false' 。

要使用自定義的 JSONDecoder 子類(lèi),用 cls 指定他;否則使用 JSONDecoder 。額外的關(guān)鍵詞參數(shù)會(huì)通過(guò)類(lèi)的構(gòu)造函數(shù)傳遞。

如果反序列化的數(shù)據(jù)不是有效 JSON 文檔,引發(fā) JSONDecodeError 錯(cuò)誤。

在 3.6 版更改: 所有可選形參現(xiàn)在都是 僅限關(guān)鍵字參數(shù)。

在 3.6 版更改: fp 現(xiàn)在可以是 binary file 。輸入編碼應(yīng)當(dāng)是 UTF-8 , UTF-16 或者 UTF-32 。

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)?

使用這個(gè) 轉(zhuǎn)換表s (一個(gè)包含 JSON 文檔的 str, bytesbytearray 實(shí)例) 反序列化為 Python 對(duì)象。

其他參數(shù)的含義與 load() 中的相同。

如果反序列化的數(shù)據(jù)不是有效 JSON 文檔,引發(fā) JSONDecodeError 錯(cuò)誤。

在 3.6 版更改: s 現(xiàn)在可以為 bytesbytearray 類(lèi)型。 輸入編碼應(yīng)為 UTF-8, UTF-16 或 UTF-32。

在 3.9 版更改: 關(guān)鍵字參數(shù) encoding 已被移除。

編碼器和解碼器?

class json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)?

簡(jiǎn)單的JSON解碼器。

默認(rèn)情況下,解碼執(zhí)行以下翻譯:

JSON

Python

object -- 對(duì)象

dict

array

list -- 列表

string

str

number (int)

int

number (real)

float

true

True

false

False

null

None

它還將“NaN”、“Infinity”和“-Infinity”理解為它們對(duì)應(yīng)的“float”值,這超出了JSON規(guī)范。

如果指定了 object_hook,它將被調(diào)用并傳入每個(gè)已解碼 JSON 對(duì)象的結(jié)果,并且其返回值將被用來(lái)替代給定的 dict。 它可被用于提供自定義的反序列化操作(例如支持 JSON-RPC 類(lèi)提示)。

如果指定了 object_pairs_hook 則它將被調(diào)用并傳入以對(duì)照值有序列表進(jìn)行解碼的每個(gè) JSON 對(duì)象的結(jié)果。 object_pairs_hook 的結(jié)果值將被用來(lái)替代 dict。 這一特性可被用于實(shí)現(xiàn)自定義解碼器。 如果還定義了 object_hook,則 object_pairs_hook 的優(yōu)先級(jí)更高。

在 3.1 版更改: 添加了對(duì) object_pairs_hook 的支持。

parse_float ,如果指定,將與每個(gè)要解碼 JSON 浮點(diǎn)數(shù)的字符串一同調(diào)用。默認(rèn)狀態(tài)下,相當(dāng)于 float(num_str) ??梢杂糜趯?duì) JSON 浮點(diǎn)數(shù)使用其它數(shù)據(jù)類(lèi)型和語(yǔ)法分析程序 (比如 decimal.Decimal )。

parse_int ,如果指定,將與每個(gè)要解碼 JSON 整數(shù)的字符串一同調(diào)用。默認(rèn)狀態(tài)下,相當(dāng)于 int(num_str) 。可以用于對(duì) JSON 整數(shù)使用其它數(shù)據(jù)類(lèi)型和語(yǔ)法分析程序 (比如 float )。

parse_constant ,如果指定,將要與以下字符串中的一個(gè)一同調(diào)用: '-Infinity' , 'Infinity' , 'NaN' 。如果遇到無(wú)效的 JSON 數(shù)字則可以使用它引發(fā)異常。

如果 strict 為 false (默認(rèn)為 True ),那么控制字符將被允許在字符串內(nèi)。在此上下文中的控制字符編碼在范圍 0--31 內(nèi)的字符,包括 '\t' (制表符), '\n' , '\r''\0' 。

如果反序列化的數(shù)據(jù)不是有效 JSON 文檔,引發(fā) JSONDecodeError 錯(cuò)誤。

在 3.6 版更改: 所有形參現(xiàn)在都是 僅限關(guān)鍵字參數(shù)

decode(s)?

返回 s 的 Python 表示形式(包含一個(gè) JSON 文檔的 str 實(shí)例)。

如果給定的 JSON 文檔無(wú)效則將引發(fā) JSONDecodeError。

raw_decode(s)?

s 中解碼出 JSON 文檔(以 JSON 文檔開(kāi)頭的一個(gè) str 對(duì)象)并返回一個(gè) Python 表示形式為 2 元組以及指明該文檔在 s 中結(jié)束位置的序號(hào)。

這可以用于從一個(gè)字符串解碼JSON文檔,該字符串的末尾可能有無(wú)關(guān)的數(shù)據(jù)。

class json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)?

用于Python數(shù)據(jù)結(jié)構(gòu)的可擴(kuò)展JSON編碼器。

默認(rèn)支持以下對(duì)象和類(lèi)型:

Python

JSON

dict

object -- 對(duì)象

list, tuple

array

str

string

int, float, int 和 float 派生的枚舉

number

True

true

False

false

None

null

在 3.4 版更改: 添加了對(duì) int 和 float 派生的枚舉類(lèi)的支持

為了將其拓展至識(shí)別其他對(duì)象,需要子類(lèi)化并實(shí)現(xiàn) default() 方法于另一種返回 o 的可序列化對(duì)象的方法如果可行,否則它應(yīng)該調(diào)用超類(lèi)實(shí)現(xiàn)(來(lái)引發(fā) TypeError )。

如果 skipkeys 為假值(默認(rèn)),則當(dāng)嘗試對(duì)非 str, int, floatNone 的鍵進(jìn)行編碼時(shí)將會(huì)引發(fā) TypeError。 如果 skipkeys 為真值,這些條目將被直接跳過(guò)。

如果 ensure_ascii 是 true (即默認(rèn)值),輸出保證將所有輸入的非 ASCII 字符轉(zhuǎn)義。如果 ensure_ascii 是 false,這些字符會(huì)原樣輸出。

If check_circular is true (the default), then lists, dicts, and custom encoded objects will be checked for circular references during encoding to prevent an infinite recursion (which would cause a RecursionError). Otherwise, no such check takes place.

如果 allow_nan 為 true (默認(rèn)),那么 NaNInfinity ,和 -Infinity 進(jìn)行編碼。此行為不符合 JSON 規(guī)范,但與大多數(shù)的基于 Javascript 的編碼器和解碼器一致。否則,它將是一個(gè) ValueError 來(lái)編碼這些浮點(diǎn)數(shù)。

如果 sort_keys 為 true (默認(rèn)為: False ),那么字典的輸出是按照鍵排序;這對(duì)回歸測(cè)試很有用,以確??梢悦刻毂容^ JSON 序列化。

如果 indent 是一個(gè)非負(fù)整數(shù)或者字符串,那么 JSON 數(shù)組元素和對(duì)象成員會(huì)被美化輸出為該值指定的縮進(jìn)等級(jí)。 如果縮進(jìn)等級(jí)為零、負(fù)數(shù)或者 "",則只會(huì)添加換行符。 None (默認(rèn)值) 選擇最緊湊的表達(dá)。 使用一個(gè)正整數(shù)會(huì)讓每一層縮進(jìn)同樣數(shù)量的空格。 如果 indent 是一個(gè)字符串 (比如 "\t"),那個(gè)字符串會(huì)被用于縮進(jìn)每一層。

在 3.2 版更改: 現(xiàn)允許使用字符串作為 indent 而不再僅僅是整數(shù)。

當(dāng)被指定時(shí),separators 應(yīng)當(dāng)是一個(gè) (item_separator, key_separator) 元組。當(dāng) indentNone 時(shí),默認(rèn)值取 (', ', ': '),否則取 (',', ': ')。為了得到最緊湊的 JSON 表達(dá)式,你應(yīng)該指定其為 (',', ':') 以消除空白字符。

在 3.4 版更改: 現(xiàn)當(dāng) indent 不是 None 時(shí),采用 (',', ': ') 作為默認(rèn)值。

當(dāng) default 被指定時(shí),其應(yīng)該是一個(gè)函數(shù),每當(dāng)某個(gè)對(duì)象無(wú)法被序列化時(shí)它會(huì)被調(diào)用。它應(yīng)該返回該對(duì)象的一個(gè)可以被 JSON 編碼的版本或者引發(fā)一個(gè) TypeError。如果沒(méi)有被指定,則會(huì)直接引發(fā) TypeError。

在 3.6 版更改: 所有形參現(xiàn)在都是 僅限關(guān)鍵字參數(shù)。

default(o)?

在子類(lèi)中實(shí)現(xiàn)這種方法使其返回 o 的可序列化對(duì)象,或者調(diào)用基礎(chǔ)實(shí)現(xiàn)(引發(fā) TypeError )。

例如,為了支持任意的迭代器,你可以這樣來(lái)實(shí)現(xiàn) default():

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
encode(o)?

返回 Python o 數(shù)據(jù)結(jié)構(gòu)的 JSON 字符串表達(dá)方式。例如:

>>>
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})
'{"foo": ["bar", "baz"]}'
iterencode(o)?

編碼給定對(duì)象 o ,并且讓每個(gè)可用的字符串表達(dá)方式。例如:

for chunk in json.JSONEncoder().iterencode(bigobject):
    mysocket.write(chunk)

異常?

exception json.JSONDecodeError(msg, doc, pos)?

擁有以下附加屬性的 ValueError 的子類(lèi):

msg?

未格式化的錯(cuò)誤消息。

doc?

正在解析的 JSON 文檔。

pos?

The start index of doc where parsing failed.

lineno?

The line corresponding to pos.

colno?

The column corresponding to pos.

3.5 新版功能.

標(biāo)準(zhǔn)符合性和互操作性?

The JSON format is specified by RFC 7159 and by ECMA-404. This section details this module's level of compliance with the RFC. For simplicity, JSONEncoder and JSONDecoder subclasses, and parameters other than those explicitly mentioned, are not considered.

此模塊不嚴(yán)格遵循于 RFC ,它實(shí)現(xiàn)了一些擴(kuò)展是有效的 Javascript 但不是有效的 JSON。尤其是:

  • 無(wú)限和 NaN 數(shù)值是被接受并輸出;

  • 對(duì)象內(nèi)的重復(fù)名稱(chēng)是接受的,并且僅使用最后一對(duì)屬性-值對(duì)的值。

自從 RFC 允許符合 RFC 的語(yǔ)法分析程序接收 不符合 RFC 的輸入文本以來(lái),這個(gè)模塊的解串器在默認(rèn)狀態(tài)下默認(rèn)符合 RFC 。

字符編碼?

RFC 要求使用 UTF-8 , UTF-16 ,或 UTF-32 之一來(lái)表示 JSON ,為了最大互通性推薦使用 UTF-8 。

RFC允許,盡管不是必須的,這個(gè)模塊的序列化默認(rèn)設(shè)置為 ensure_ascii=True ,這樣消除輸出以便結(jié)果字符串至容納 ASCII 字符。

ensure_ascii 參數(shù)以外,此模塊是嚴(yán)格的按照在 Python 對(duì)象和 Unicode strings 間的轉(zhuǎn)換定義的,并且因此不能直接解決字符編碼的問(wèn)題。

RFC 禁止添加字符順序標(biāo)記( BOM )在 JSON 文本的開(kāi)頭,這個(gè)模塊的序列化器不添加 BOM 標(biāo)記在它的輸出上。 RFC,準(zhǔn)許 JSON 反序列化器忽略它們輸入中的初始 BOM 標(biāo)記,但不要求。此模塊的反序列化器引發(fā) ValueError 當(dāng)存在初始 BOM 標(biāo)記。

RFC 不會(huì)明確禁止包含字節(jié)序列的 JSON 字符串這不對(duì)應(yīng)有效的 Unicode 字符(比如 不成對(duì)的 UTF-16 的替代物),但是它確實(shí)指出它們可能會(huì)導(dǎo)致互操作性問(wèn)題。默認(rèn)下,模塊對(duì)這樣的序列接受和輸出(當(dāng)在原始 str 存在時(shí))代碼點(diǎn)。

Infinite 和 NaN 數(shù)值?

RFC 不允許 infinite 或者 NaN 數(shù)值的表達(dá)方式。盡管這樣,默認(rèn)情況下,此模塊接受并且輸出 Infinity , -Infinity,和 NaN 好像它們是有效的JSON數(shù)字字面值

>>>
>>> # Neither of these calls raises an exception, but the results are not valid JSON
>>> json.dumps(float('-inf'))
'-Infinity'
>>> json.dumps(float('nan'))
'NaN'
>>> # Same when deserializing
>>> json.loads('-Infinity')
-inf
>>> json.loads('NaN')
nan

序列化器中, allow_nan 參數(shù)可用于替代這個(gè)行為。反序列化器中, parse_constant 參數(shù),可用于替代這個(gè)行為。

對(duì)象中的重復(fù)名稱(chēng)?

RFC 具體說(shuō)明了 在 JSON對(duì)象里的名字應(yīng)該是唯一的,但沒(méi)有規(guī)定如何處理JSON對(duì)象中的重復(fù)名稱(chēng)。默認(rèn)下,此模塊不引發(fā)異常;作為替代,對(duì)于給定名它將忽略除姓-值對(duì)之外的所有對(duì):

>>>
>>> weird_json = '{"x": 1, "x": 2, "x": 3}'
>>> json.loads(weird_json)
{'x': 3}

The object_pairs_hook parameter can be used to alter this behavior.

頂級(jí)非對(duì)象,非數(shù)組值?

過(guò)時(shí)的 RFC 4627 指定的舊版本 JSON 要求 JSON 文本頂級(jí)值必須是 JSON 對(duì)象或數(shù)組( Python dictlist ),并且不能是 JSON null 值,布爾值,數(shù)值或者字符串值。 RFC 7159 移除這個(gè)限制,此模塊沒(méi)有并且從未在序列化器和反序列化器中實(shí)現(xiàn)這個(gè)限制。

無(wú)論如何,為了最大化地獲取互操作性,你可能希望自己遵守該原則。

實(shí)現(xiàn)限制?

一些 JSON 反序列化器的實(shí)現(xiàn)應(yīng)該在以下方面做出限制:

  • 可接受的 JSON 文本大小

  • 嵌套 JSON 對(duì)象和數(shù)組的最高水平

  • JSON 數(shù)字的范圍和精度

  • JSON 字符串的內(nèi)容和最大長(zhǎng)度

此模塊不強(qiáng)制執(zhí)行任何上述限制,除了相關(guān)的 Python 數(shù)據(jù)類(lèi)型本身或者 Python 解釋器本身的限制以外。

當(dāng)序列化為 JSON ,在應(yīng)用中當(dāng)心此類(lèi)限制這可能破壞你的 JSON 。特別是,通常將 JSON 數(shù)字反序列化為 IEEE 754 雙精度數(shù)字,從而受到該表示方式的范圍和精度限制。這是特別相關(guān)的,當(dāng)序列化非常大的 Python int 值時(shí),或者當(dāng)序列化 "exotic" 數(shù)值類(lèi)型的實(shí)例時(shí)比如 decimal.Decimal

命令行界面?

源代碼: Lib/json/tool.py


The json.tool module provides a simple command line interface to validate and pretty-print JSON objects.

如果未指定可選的 infileoutfile 參數(shù),則將分別使用 sys.stdinsys.stdout:

$ echo '{"json": "obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

在 3.5 版更改: 輸出現(xiàn)在將與輸入順序保持一致。 請(qǐng)使用 --sort-keys 選項(xiàng)來(lái)將輸出按照鍵的字母順序排序。

命令行選項(xiàng)?

infile?

要被驗(yàn)證或美化打印的 JSON 文件:

$ python -m json.tool mp_films.json
[
    {
        "title": "And Now for Something Completely Different",
        "year": 1971
    },
    {
        "title": "Monty Python and the Holy Grail",
        "year": 1975
    }
]

如果 infile 未指定,則從 sys.stdin 讀取。

outfile?

infile 輸出寫(xiě)入到給定的 outfile。 在其他情況下寫(xiě)入到 sys.stdout。

--sort-keys?

將字典輸出按照鍵的字母順序排序。

3.5 新版功能.

--no-ensure-ascii?

禁用非 ASCII 字符的轉(zhuǎn)義,詳情參見(jiàn) json.dumps()。

3.9 新版功能.

--json-lines?

將每個(gè)輸入行解析為單獨(dú)的 JSON 對(duì)象。

3.8 新版功能.

--indent, --tab, --no-indent, --compact?

用于空白符控制的互斥選項(xiàng)。

3.9 新版功能.

-h, --help?

顯示幫助消息。

備注

1

正如 RFC 7159 的勘誤表 所說(shuō)明的,JSON 允許以字符串表示字面值字符 U+2028 (LINE SEPARATOR) 和 U+2029 (PARAGRAPH SEPARATOR),而 JavaScript (在 ECMAScript 5.1 版中) 不允許。