什么是JSON?
??JSON是一種數(shù)據(jù)交換的標(biāo)準(zhǔn)格式,它受到JavaScript的啟發(fā)。通常,JSON采用字符串或文本格式。json代表javascript對(duì)象表示法。
??json:json的語(yǔ)法是作為鍵和值對(duì)編寫的
{
"Key": "Value",
"Key": "Value",
}
??JSON與Python字典非常相似。python支持JSON,它有一個(gè)內(nèi)置的庫(kù)作為JSON
SON庫(kù)的Python
??是元帥和泡菜是在外部maintain modules of version of JSON的Python庫(kù)。相關(guān)業(yè)務(wù)的性能和解碼JSON編碼的Python類You need to json圖書館和第一進(jìn)出口文件在你的.py for that,
import json
??Following methods are available in the JSON module
方法 | 描述 |
---|---|
dumps() | 編碼為JSON對(duì)象 |
dump() | 編碼的字符串寫在文件上 |
loads() | 解碼JSON字符串 |
load() | 在讀取JSON文件時(shí)解碼 |
Python到JSON(編碼)
??默認(rèn)情況下,JSON Library of Python執(zhí)行以下Python對(duì)象轉(zhuǎn)換為JSON對(duì)象
Python | JSON |
---|---|
dict | Object |
list | Array |
unicode | String |
number - int, long | number – int |
float | number – real |
True | True |
False | False |
None | Null |
??將Python數(shù)據(jù)轉(zhuǎn)換為JSON稱為編碼操作。編碼是在JSON庫(kù)方法的幫助下完成的 - dumps()
??dumps()方法將python的字典對(duì)象轉(zhuǎn)換為JSON字符串?dāng)?shù)據(jù)格式。
現(xiàn)在讓我們用Python執(zhí)行我們的第一個(gè)編碼示例。
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice","Bob"),
"pets": ['Dog'],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
輸出:
{“person”:{“name”:“Kenn”,“sex”:“male”,“age”:28}})
??讓我們使用相同的函數(shù)dump()創(chuàng)建字典的JSON文件
# here we create new data_file.json file with write mode using file i/o operation
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)
輸出:
??無(wú)需顯示...在您的系統(tǒng)中創(chuàng)建了json_file.json,您可以檢查該文件。
JSON到Python(解碼)
??JSON字符串解碼是在Python的JSON庫(kù)的內(nèi)置方法load()和load()的幫助下完成的。這里的轉(zhuǎn)換表顯示了Python對(duì)象的JSON對(duì)象示例,這些對(duì)象有助于在Python中執(zhí)行JSON字符串解碼。
JSON | Python |
---|---|
Object | dict |
Array | list |
String | unicode |
number – int | number - int, long |
number – real | float |
True | True |
False | False |
Null | None |
??讓我們看看在json.loads()函數(shù)的幫助下在Python中解碼的基本示例
import json # json library imported
# json data string
person_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}'
# Decoding or converting JSON format in dictionary using loads()
dict_obj = json.loads(person_data)
print(dict_obj)
# check type of dict_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
print("Person......", dict_obj.get('person'))
輸出:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}
解碼JSON文件或解析Python中的JSON文件
??注意:解碼JSON文件是文件輸入/輸出(I / O)相關(guān)的操作。JSON文件必須存在于您指定的程序中指定位置的系統(tǒng)上。
例:
import json
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
# store file data in object
data = json.load(file_object)
print(data)
??這里的數(shù)據(jù)是Python的字典對(duì)象。
輸出:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Python中的緊湊編碼
??當(dāng)您需要減小JSON文件的大小時(shí),可以在Python中使用緊湊編碼。
例:
import json
# Create a List that contains dictionary
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
# separator used for compact representation of JSON.
# Use of ',' to identify list items
# Use of ':' to identify key and value in dictionary
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)
輸出:
'["a", "b", "c", {"4": 5, "6": 7}]'
Here output of JSON is represented in a single line which is the most compact representation by
removing the space character from compact_obj
格式化JSON代碼(漂亮打印)
??目的是為人類理解編寫格式良好的代碼。借助漂亮的打印功能,任何人都可以輕松理解代碼。
例:
import json
dic = { 'a': 4, 'b': 5 }
''' To format the code use of indent and 4 shows number of space and use of separator is not
necessary but standard way to write code of particular function. '''
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)
輸出:
{
"a" : 4,
"b" : 5
}
為了更好地理解這一點(diǎn),將縮進(jìn)更改為40并觀察輸出 -
訂購(gòu)JSON代碼:
??dumps中的sort_keys屬性函數(shù)的參數(shù)將按升序?qū)SON中的鍵進(jìn)行排序。sort_keys參數(shù)是一個(gè)布爾屬性。當(dāng)它是真正的排序時(shí),否則不允許
例:
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": [ 'Dog' ],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
],
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
輸出:
{
"age": 45,
"cars": [ {
"model": "Audi A1",
"mpg": 15.1
},
{
"model": "Zeep Compass",
"mpg": 18.1
}
],
"children": [ "Alice",
"Bob"
],
"married": true,
"name": "Ken",
"pets": [
"Dog"
]
}
您可能會(huì)看到鑰匙的年齡,汽車,兒童等按升序排列。
Python的復(fù)雜對(duì)象編碼
Complex對(duì)象有兩個(gè)不同的部分
- 真實(shí)的部分
- 想象中的一部分
??在執(zhí)行復(fù)雜對(duì)象的編碼之前,需要檢查變量是否復(fù)雜。您需要?jiǎng)?chuàng)建一個(gè)函數(shù),該函數(shù)使用實(shí)例方法檢查存儲(chǔ)在變量中的值。
??讓我們?yōu)閏heck對(duì)象創(chuàng)建特定的函數(shù)是復(fù)雜的還是有資格進(jìn)行編碼。
import json
# create function to check instance is complex or not
def complex_encode(object):
# check using isinstance method
if isinstance(object, complex):
return [object.real, object.imag]
# raised error using exception handling if object is not complex
raise TypeError(repr(object) + " is not JSON serialized")
# perform json encoding by passing parameter
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)
輸出:
'[4.0, 5.0]'
Python中的復(fù)雜JSON對(duì)象解碼
??要在JSON中解碼復(fù)雜對(duì)象,請(qǐng)使用object_hook參數(shù),該參數(shù)檢查JSON字符串是否包含復(fù)雜對(duì)象。
例:
import json
# function check JSON string contains complex object
def is_complex(objct):
if '__complex__' in objct:
return complex(objct['real'], objct['img'])
return objct
# use of json loads method with object_hook for check object complex or not
complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
#here we not passed complex object so it's convert into dictionary
simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)
print("Complex_object......",complex_object)
print("Without_complex_object......",simple_object)
輸出:
Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}
JSON序列化類JSONEncoder概述
??JSONEncoder類用于在執(zhí)行編碼時(shí)對(duì)任何Python對(duì)象進(jìn)行序列化。它包含三種不同的編碼方法
- default(o) - 在子類中實(shí)現(xiàn)并返回o對(duì)象的serialize 對(duì)象。
- encode(o) - 與json.dumps()方法相同,返回Python數(shù)據(jù)結(jié)構(gòu)的JSON字符串。
- iterencode(o) - 逐個(gè)表示字符串并編碼對(duì)象o。
??借助JSONEncoder類的encode()方法,我們還可以對(duì)任何Python對(duì)象進(jìn)行編碼。
# import JSONEncoder class from json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)
Output:
輸出:
'{"colour": ["red", "yellow", "green"]}'
JSON反序列化類JSONDecoder概述
??JSONDecoder類用于在執(zhí)行解碼時(shí)對(duì)任何Python對(duì)象進(jìn)行反序列化。它包含三種不同的解碼方法
- default(o) - 在子類中實(shí)現(xiàn)并返回反序列化的對(duì)象o對(duì)象。
- decode(o) - 與json.loads()方法相同,返回JSON字符串或數(shù)據(jù)的Python數(shù)據(jù)結(jié)構(gòu)。
- raw_decode(o) - 逐個(gè)表示Python字典并解碼對(duì)象o。
??借助JSONDecoder類的decode()方法,我們還可以解碼JSON字符串。
import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().decode(colour_string)
輸出:
{'colour': ['red', 'yellow']}
從URL解碼JSON數(shù)據(jù):Real Life Example
我們將從指定的URL(https://feeds.citibikenyc.com/stations/stations.json)獲取CityBike NYC(自行車共享系統(tǒng))的數(shù)據(jù)并轉(zhuǎn)換為字典格式。
例:
注意: - 確保已在Python中安裝了請(qǐng)求庫(kù),如果沒有,則打開終端或CMD并鍵入
- (對(duì)于Python 3或更高版本)pip3安裝請(qǐng)求
import json
import requests
# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0])
輸出:
<class 'str'>
<class 'dict'>
{
'id': 487,
'stationName': 'E 20 St & FDR Drive',
'availableDocks': 24,
'totalDocks': 34,
'latitude': 40.73314259,
'longitude': -73.97573881,
'statusValue': 'In Service',
'statusKey': 1,
'availableBikes': 9,
'stAddress1': 'E 20 St & FDR Drive',
'stAddress2': '',
'city': '',
'postalCode': '',
'location': '',
'altitude': '',
'testStation': False,
'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''
}
與Python中的JSON庫(kù)相關(guān)的異常:
- 類json.JSONDecoderError處理與解碼操作相關(guān)的異常。它是ValueError的子類。
- 異常 - json.JSONDecoderError(msg,doc)
- 異常參數(shù)是,
- msg - 未格式化的錯(cuò)誤消息
- doc - 解析JSON文檔
- pos - 失敗時(shí)的doc開始索引
- lineno - line no shows對(duì)應(yīng)pos
- 冒號(hào) - 列對(duì)應(yīng)于pos
例:
import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
with open('json_file_name.json') as file_object:
data = json.load(file_object)
except ValueError:
print("Bad JSON file format, Change JSON File")
Python中的無(wú)限和NaN數(shù)字
??JSON數(shù)據(jù)交換格式(RFC - Request For Comments)不允許無(wú)限值或Nan值,但Python-JSON庫(kù)中沒有限制執(zhí)行無(wú)限和Nan值相關(guān)操作。如果JSON獲得INFINITE和Nan數(shù)據(jù)類型,則將其轉(zhuǎn)換為文字。
例:
import json
# pass float Infinite value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))
輸出:
Infinity
<class 'str'>
NaN
inf
<class 'float'>
JSON字符串中的重復(fù)鍵
??RFC指定密鑰名稱在JSON對(duì)象中應(yīng)該是唯一的,但它不是必需的。Python JSON庫(kù)不會(huì)引發(fā)JSON中重復(fù)對(duì)象的異常。它忽略所有重復(fù)的鍵值對(duì),并僅考慮它們中的最后一個(gè)鍵值對(duì)。
例:
import json
repeat_pair = '{"a": 1, "a": 2, "a": 3}'
json.loads(repeat_pair)
輸出:
{'a': 3}
在Python中使用JSON的CLI(命令行界面)
??json.tool提供命令行界面來(lái)驗(yàn)證JSON漂亮的打印語(yǔ)法。我們來(lái)看一個(gè)CLI的例子
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
輸出:
{
"name": " Kings Authur "
}
Python中JSON的優(yōu)點(diǎn)
- 容易在容器和值之間移回(JSON到Python和Python到JSON)
- 人類可讀(漂亮打印)JSON對(duì)象
- 廣泛用于數(shù)據(jù)處理。
- 單個(gè)文件中沒有相同的數(shù)據(jù)結(jié)構(gòu)。
Python中JSON的實(shí)現(xiàn)限制
- 在JSON范圍的解串器和預(yù)測(cè)數(shù)字
- JSON字符串的最大長(zhǎng)度和JSON數(shù)組以及對(duì)象的嵌套級(jí)別。
Cheat Code
json.dumps(person_data) | 創(chuàng)建JSON對(duì)象 |
---|---|
json.dump(person_data, file_write) | 使用Python的File I / O創(chuàng)建JSON文件 |
compact_obj = json.dumps(data, separators=(',',':')) | 通過(guò)使用分隔符從JSON對(duì)象中刪除空格字符來(lái)壓縮JSON對(duì)象 |
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': ')) | 使用Indent格式化JSON代碼 |
sorted_string = json.dumps(x, indent=4, sort_keys=True) | 按字母順序?qū)SON對(duì)象鍵進(jìn)行排序 |
complex_obj = json.dumps(4 + 5j, default=complex_encode) | JSON中的Python復(fù)雜對(duì)象編碼 |
JSONEncoder().encode(colour_dict) | 使用JSONEncoder類進(jìn)行序列化 |
json.loads(data_string) | 使用json.loads()函數(shù)解碼Python字典中的JSON字符串 |
json.loads('{"complex": true, "real": 4, "img": 5}', object_hook = is_complex) | 將復(fù)雜的JSON對(duì)象解碼為Python |
JSONDecoder().decode(colour_string) | 使用反序列化將JSON解碼到Python |