Python編程中,經(jīng)常會(huì)遇到需要讀取和解析JSON數(shù)據(jù)的場(chǎng)景。JSON(JavaScript Object Notation)是一種常用的數(shù)據(jù)交換格式,具有易讀性和易解析性。本文將介紹如何使用Python讀取和解析JSON數(shù)據(jù),幫助讀者掌握這一重要的數(shù)據(jù)處理技能。
Python中讀取JSON數(shù)據(jù)可以使用json庫(kù)。首先,我們需要導(dǎo)入json模塊:
import json
接下來(lái),我們可以使用open()函數(shù)打開JSON文件,并使用json.load()方法將文件中的JSON數(shù)據(jù)加載為Python對(duì)象:
with open('datas.json', 'r') as file:
data=json.load(file)
其中,datas.json是存儲(chǔ)JSON數(shù)據(jù)的文件名,可以根據(jù)實(shí)際情況進(jìn)行修改。讀取后的JSON數(shù)據(jù)將被存儲(chǔ)在變量data中。
如果JSON數(shù)據(jù)是字符串類型,而不是存儲(chǔ)在文件中,我們可以使用json.loads()方法將字符串解析為Python對(duì)象:
data_str='{"name": "John", "age": 30}'
data=json.loads(data_str)
此時(shí),JSON數(shù)據(jù)將被解析并存儲(chǔ)在變量data中。
一旦讀取JSON數(shù)據(jù)并將其加載到Python對(duì)象中,我們可以使用Python的數(shù)據(jù)訪問語(yǔ)法來(lái)解析和提取數(shù)據(jù)。
例如,假設(shè)JSON數(shù)據(jù)如下所示:
{
"name": "John",
"age": 30,
"city": "New York"
}
我們可以使用以下代碼解析并訪問這些數(shù)據(jù):
name=data['name']
age=data['age']
city=data['city']
print(name) # 輸出:John
print(age) # 輸出:30
print(city) # 輸出:New York
此處,我們通過(guò)訪問data字典的鍵(即JSON數(shù)據(jù)中的屬性名)來(lái)獲取對(duì)應(yīng)的值。
對(duì)于嵌套的JSON數(shù)據(jù),我們可以使用相同的方法進(jìn)行訪問。例如,如果JSON數(shù)據(jù)如下所示:
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"state": "NY"
}
}
我們可以使用以下代碼解析并訪問嵌套的數(shù)據(jù):
street=data['address']['street']
city=data['address']['city']
state=data['address']['state']
print(street) # 輸出:123 Main St
print(city) # 輸出:New York
print(state) # 輸出:NY
讀取和解析JSON數(shù)據(jù)后,我們可以對(duì)其進(jìn)行進(jìn)一步處理和操作。例如,我們可以根據(jù)數(shù)據(jù)的內(nèi)容和結(jié)構(gòu)進(jìn)行條件判斷、循環(huán)遍歷、數(shù)據(jù)篩選等操作。
以下是一些處理JSON數(shù)據(jù)的示例:
遍歷JSON數(shù)據(jù)中的所有屬性和值:
for key, value in data.items():
print(key, value)
根據(jù)條件篩選數(shù)據(jù):
filtered_data=[item for item in data if item['age'] > 25]
將JSON數(shù)據(jù)轉(zhuǎn)換為字符串:
data_str=json.dumps(data)
本文介紹了如何在Python中讀取和解析JSON數(shù)據(jù)。通過(guò)掌握這一技巧,我們可以輕松地處理JSON數(shù)據(jù),并根據(jù)實(shí)際需求進(jìn)行進(jìn)一步的操作和處理。
確保JSON數(shù)據(jù)的格式正確,否則可能導(dǎo)致解析錯(cuò)誤。
注意處理JSON數(shù)據(jù)中的空值和缺失值的情況,以避免引發(fā)異常。
在處理大型JSON數(shù)據(jù)時(shí),注意內(nèi)存的占用情況,避免因數(shù)據(jù)量過(guò)大而導(dǎo)致程序崩潰或運(yùn)行緩慢。
使用合適的數(shù)據(jù)結(jié)構(gòu)和算法,以提高JSON數(shù)據(jù)的查詢和處理效率。
在處理敏感數(shù)據(jù)時(shí)要保證數(shù)據(jù)的安全性和隱私性,避免信息泄露。
希望本文可以幫助讀者掌握Python讀取和解析JSON數(shù)據(jù)的技巧,提升數(shù)據(jù)處理能力。
午辦公室暖氣很熱,大家的工作狀態(tài)都不是特別好,感覺每個(gè)人都像樹懶一樣或緩慢移動(dòng)鼠標(biāo)、或懶懶的打著瞌睡。小白也不在狀態(tài)呆呆的盯著電腦,不知道該做些什么。經(jīng)過(guò)一陣陣朦朧的困感之后,小白還是起身找到了老朱。
“朱哥,下午實(shí)在沒狀態(tài),有沒有簡(jiǎn)單點(diǎn)的知識(shí),給我說(shuō)一個(gè)唄!”
老朱也不在狀態(tài),布局方面的實(shí)在是不想說(shuō),思考了半天說(shuō)道:“要不說(shuō)一下JSON數(shù)據(jù)吧,這個(gè)簡(jiǎn)單,你只要了解了JSON數(shù)據(jù)接下來(lái)就可以說(shuō)前端和后臺(tái)通信的事了。”
“好啊!”,小白一聽終于能做通信方面的事情后,腦袋一下清醒了不少。
老朱說(shuō):“JSON數(shù)據(jù)可以看作是對(duì)象的字符串形式。”
“既然有了對(duì)象Object還要JSON干嘛呢?”,小白問道。
“通過(guò)JSON串我們可以很方便的進(jìn)行數(shù)據(jù)通信,比如通過(guò)ajax去加載一個(gè)頁(yè)面,被加載的頁(yè)面如果沒有html標(biāo)簽只有JSON格式的字符串,我們就可以把JSON串轉(zhuǎn)換為JavaScript對(duì)象輕松進(jìn)行數(shù)據(jù)處理了。”
“聽得有點(diǎn)暈!”
“你可以想象一下,你的個(gè)人信息都在數(shù)據(jù)庫(kù)存著,有一個(gè)php頁(yè)面可以把你的信息從數(shù)據(jù)取出來(lái),現(xiàn)在讓你通過(guò)js獲取用戶信息,你怎么辦?”
“是不是通過(guò)JS加載獲取用戶信息的那個(gè)php頁(yè)面?”
老朱說(shuō)道:“沒錯(cuò),那你是希望php頁(yè)面給你輸出一個(gè)含有用戶信息、html標(biāo)簽和CSS的,還是返回你的昵稱、電話、頭像信息你再在前端通過(guò)JS進(jìn)行處理?”
“肯定是后者啊,這樣我就能把用戶信息放到頁(yè)面任意想放的位置了。還有一個(gè)好處,只有用戶的信息的數(shù)據(jù)字符串長(zhǎng)度非常小,也有利于訪問速度。”
“恩,理解的不錯(cuò)!就是這個(gè)意思。實(shí)際開發(fā)的時(shí)候JSON串不會(huì)像我們現(xiàn)在定義的JSON串那樣簡(jiǎn)單,如果我們要獲取一個(gè)文章列表頁(yè)的JSON串,它里面可能會(huì)包含欄目的id、欄目標(biāo)題、文章列表(可能會(huì)是一個(gè)數(shù)組,也可能是一個(gè)列表對(duì)象)、每頁(yè)顯示條數(shù)、文章總數(shù)、用戶信息(一個(gè)對(duì)象,它里面又包含用戶的昵稱、電話、頭像等)。”
“一般從外部加載的JSON串JavaScript會(huì)自動(dòng)把JSON串轉(zhuǎn)換為Object對(duì)象,如果是自定義的JSON字符串我們需要使用JSON.parse(JSON串)進(jìn)行兌現(xiàn)轉(zhuǎn)換。現(xiàn)在我們把剛剛定義的jstr串轉(zhuǎn)換為對(duì)象控制臺(tái)輸出看一下。”
“最近一兩天我們嘗試做一次外部數(shù)據(jù)加載,看看你能不能理解,如果能理解我們就可以從一個(gè)小項(xiàng)目開始練習(xí)了。”
小白高興的說(shuō)道:“好啊!太期待了!”
最后給大家推薦一個(gè)前端內(nèi)部學(xué)習(xí)群:675498134,進(jìn)群找管理免費(fèi)領(lǐng)取學(xué)習(xí)資料和視頻。每天還是技術(shù)大牛直播分享前端項(xiàng)目開發(fā)經(jīng)驗(yàn)。大佬小白都?xì)g迎,大家一起學(xué)習(xí)共同進(jìn)步!
人已經(jīng)過(guò)原 Danny Markov 授權(quán)翻譯
在本教程中,我們將學(xué)習(xí)如何使用 JS 進(jìn)行AJAX調(diào)用。
術(shù)語(yǔ)AJAX 表示 異步的 JavaScript 和 XML。
AJAX 在 JS 中用于發(fā)出異步網(wǎng)絡(luò)請(qǐng)求來(lái)獲取資源。當(dāng)然,不像名稱所暗示的那樣,資源并不局限于XML,還用于獲取JSON、HTML或純文本等資源。
有多種方法可以發(fā)出網(wǎng)絡(luò)請(qǐng)求并從服務(wù)器獲取數(shù)據(jù)。我們將一一介紹。
XMLHttpRequest對(duì)象(簡(jiǎn)稱XHR)在較早的時(shí)候用于從服務(wù)器異步檢索數(shù)據(jù)。
之所以使用XML,是因?yàn)樗紫扔糜跈z索XML數(shù)據(jù)。現(xiàn)在,它也可以用來(lái)檢索JSON, HTML或純文本。
function success() {
var data = JSON.parse(this.responseText)
console.log(data)
}
function error (err) {
console.log('Error Occurred:', err)
}
var xhr = new XMLHttpRequest()
xhr.onload = success
xhr.onerror = error
xhr.open("GET", ""https://jsonplaceholder.typicode.com/posts/1")
xhr.send()
我們看到,要發(fā)出一個(gè)簡(jiǎn)單的GET請(qǐng)求,需要兩個(gè)偵聽器來(lái)處理請(qǐng)求的成功和失敗。我們還需要調(diào)用open()和send()方法。來(lái)自服務(wù)器的響應(yīng)存儲(chǔ)在responseText變量中,該變量使用JSON.parse()轉(zhuǎn)換為JavaScript 對(duì)象。
function success() {
var data = JSON.parse(this.responseText);
console.log(data);
}
function error(err) {
console.log('Error Occurred :', err);
}
var xhr = new XMLHttpRequest();
xhr.onload = success;
xhr.onerror = error;
xhr.open("POST", "https://jsonplaceholder.typicode.com/posts");
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xhr.send(JSON.stringify({
title: 'foo',
body: 'bar',
userId: 1
})
);
我們看到POST請(qǐng)求類似于GET請(qǐng)求。我們需要另外使用setRequestHeader設(shè)置請(qǐng)求標(biāo)頭“Content-Type” ,并使用send方法中的JSON.stringify將JSON正文作為字符串發(fā)送。
早期的開發(fā)人員,已經(jīng)使用了好多年的 XMLHttpRequest來(lái)請(qǐng)求數(shù)據(jù)了。現(xiàn)代的fetch API允許我們發(fā)出類似于XMLHttpRequest(XHR)的網(wǎng)絡(luò)請(qǐng)求。主要區(qū)別在于fetch()API使用Promises,它使 API更簡(jiǎn)單,更簡(jiǎn)潔,避免了回調(diào)地獄。
Fetch 是一個(gè)用于進(jìn)行AJAX調(diào)用的原生 JavaScript API,它得到了大多數(shù)瀏覽器的支持,現(xiàn)在得到了廣泛的應(yīng)用。
fetch(url, options)
.then(response => {
// handle response data
})
.catch(err => {
// handle errors
});
API參數(shù)
fetch() API有兩個(gè)參數(shù)
API返回Promise對(duì)象
fetch() API返回一個(gè)promise對(duì)象。
錯(cuò)誤處理
請(qǐng)注意,對(duì)于成功的響應(yīng),我們期望狀態(tài)代碼為200(正常狀態(tài)),但是即使響應(yīng)帶有錯(cuò)誤狀態(tài)代碼(例如404(未找到資源)和500(內(nèi)部服務(wù)器錯(cuò)誤)),fetch() API 的狀態(tài)也是 resolved,我們需要在.then() 塊中顯式地處理那些。
我們可以在response 對(duì)象中看到HTTP狀態(tài):
const getTodoItem = fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(response => response.json())
.catch(err => console.error(err));
getTodoItem.then(response => console.log(response));
Response
{ userId: 1, id: 1, title: "delectus aut autem", completed: false }
在上面的代碼中需要注意兩件事:
錯(cuò)誤處理
我們來(lái)看看當(dāng)HTTP GET請(qǐng)求拋出500錯(cuò)誤時(shí)會(huì)發(fā)生什么:
fetch('http://httpstat.us/500') // this API throw 500 error
.then(response => () => {
console.log("Inside first then block");
return response.json();
})
.then(json => console.log("Inside second then block", json))
.catch(err => console.error("Inside catch block:", err));
Inside first then block
? ? Inside catch block: SyntaxError: Unexpected token I in JSON at position 4
我們看到,即使API拋出500錯(cuò)誤,它仍然會(huì)首先進(jìn)入then()塊,在該塊中它無(wú)法解析錯(cuò)誤JSON并拋出catch()塊捕獲的錯(cuò)誤。
這意味著如果我們使用fetch()API,則需要像這樣顯式地處理此類錯(cuò)誤:-
fetch('http://httpstat.us/500')
.then(handleErrors)
.then(response => response.json())
.then(response => console.log(response))
.catch(err => console.error("Inside catch block:", err));
function handleErrors(response) {
if (!response.ok) { // throw error based on custom conditions on response
throw Error(response.statusText);
}
return response;
}
? Inside catch block: Error: Internal Server Error at handleErrors (Script snippet %239:9)
fetch('https://jsonplaceholder.typicode.com/todos', {
method: 'POST',
body: JSON.stringify({
completed: true,
title: 'new todo item',
userId: 1
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
})
.then(response => response.json())
.then(json => console.log(json))
.catch(err => console.log(err))
Response
? {completed: true, title: "new todo item", userId: 1, id: 201}
在上面的代碼中需要注意兩件事:-
Axios API非常類似于fetch API,只是做了一些改進(jìn)。我個(gè)人更喜歡使用Axios API而不是fetch() API,原因如下:
// 在chrome控制臺(tái)中引入腳本的方法
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://unpkg.com/axios/dist/axios.min.js';
document.head.appendChild(script);
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(response => console.log(response.data))
.catch(err => console.error(err));
Response
{ userId: 1, id: 1, title: "delectus aut autem", completed: false }
我們可以看到,我們直接使用response獲得響應(yīng)數(shù)據(jù)。數(shù)據(jù)沒有任何解析對(duì)象,不像fetch() API。
錯(cuò)誤處理
axios.get('http://httpstat.us/500')
.then(response => console.log(response.data))
.catch(err => console.error("Inside catch block:", err));
Inside catch block: Error: Network Error
我們看到,500錯(cuò)誤也被catch()塊捕獲,不像fetch() API,我們必須顯式處理它們。
axios.post('https://jsonplaceholder.typicode.com/todos', {
completed: true,
title: 'new todo item',
userId: 1
})
.then(response => console.log(response.data))
.catch(err => console.log(err))
{completed: true, title: "new todo item", userId: 1, id: 201}
我們看到POST方法非常簡(jiǎn)短,可以直接傳遞請(qǐng)求主體參數(shù),這與fetch()API不同。
作者:Danny Markov 譯者:前端小智 來(lái)源:tutorialzine
原文:https://tutorialzine.com/2017/12-terminal-commands-every-web-developer-should-know
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。