整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Python如何讀取并解析JSON數(shù)據(jù)

          Python如何讀取并解析JSON數(shù)據(jù)

          Python編程中,經(jīng)常會(huì)遇到需要讀取和解析JSON數(shù)據(jù)的場(chǎng)景。JSON(JavaScript Object Notation)是一種常用的數(shù)據(jù)交換格式,具有易讀性和易解析性。本文將介紹如何使用Python讀取和解析JSON數(shù)據(jù),幫助讀者掌握這一重要的數(shù)據(jù)處理技能。

          步驟一:讀取JSON數(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ù)

          一旦讀取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ù)

          讀取和解析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)

          總結(jié)

          本文介紹了如何在Python中讀取和解析JSON數(shù)據(jù)。通過(guò)掌握這一技巧,我們可以輕松地處理JSON數(shù)據(jù),并根據(jù)實(shí)際需求進(jìn)行進(jìn)一步的操作和處理。

          注意事項(xiàng)

          確保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)用。

          1.AJAX

          術(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ù)。我們將一一介紹。

          2.XMLHttpRequest

          XMLHttpRequest對(duì)象(簡(jiǎn)稱XHR)在較早的時(shí)候用于從服務(wù)器異步檢索數(shù)據(jù)。

          之所以使用XML,是因?yàn)樗紫扔糜跈z索XML數(shù)據(jù)。現(xiàn)在,它也可以用來(lái)檢索JSON, HTML或純文本。

          事例 2.1: GET

          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ā)送。

          2.3 XMLHttpRequest vs Fetch

          早期的開發(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)地獄。

          3. Fetch API

          Fetch 是一個(gè)用于進(jìn)行AJAX調(diào)用的原生 JavaScript API,它得到了大多數(shù)瀏覽器的支持,現(xiàn)在得到了廣泛的應(yīng)用。

          3.1 API用法

          fetch(url, options)
              .then(response => {
                  // handle response data
              })
              .catch(err => {
                  // handle errors
              });
          

          API參數(shù)

          fetch() API有兩個(gè)參數(shù)

          1. url是必填參數(shù),它是您要獲取的資源的路徑。
          2. options是一個(gè)可選參數(shù)。不需要提供這個(gè)參數(shù)來(lái)發(fā)出簡(jiǎn)單的GET請(qǐng)求。
          • method: GET | POST | PUT | DELETE | PATCH
          • headers: 請(qǐng)求頭,如 { “Content-type”: “application/json; charset=UTF-8” }
          • mode: cors | no-cors | same-origin | navigate
          • cache: default | reload | no-cache
          • body: 一般用于POST請(qǐng)求

          API返回Promise對(duì)象

          fetch() API返回一個(gè)promise對(duì)象。

          • 如果存在網(wǎng)絡(luò)錯(cuò)誤,則將拒絕,這會(huì)在.catch()塊中處理。
          • 如果來(lái)自服務(wù)器的響應(yīng)帶有任何狀態(tài)碼(如200、404、500),則promise將被解析。響應(yīng)對(duì)象可以在.then()塊中處理。

          錯(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):

          • HTTP狀態(tài)碼,例如200。
          • ok –布爾值,如果HTTP狀態(tài)代碼為200-299,則為true。

          3.3 示例:GET

          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 }
          

          在上面的代碼中需要注意兩件事:

          1. fetch API返回一個(gè)promise對(duì)象,我們可以將其分配給變量并稍后執(zhí)行。
          2. 我們還必須調(diào)用response.json()將響應(yīng)對(duì)象轉(zhuǎn)換為JSON

          錯(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)
          

          3.3 示例:POST

          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}
          

          在上面的代碼中需要注意兩件事:-

          1. POST請(qǐng)求類似于GET請(qǐng)求。我們還需要在fetch() API的第二個(gè)參數(shù)中發(fā)送method,body 和headers 屬性。
          2. 我們必須需要使用 JSON.stringify() 將對(duì)象轉(zhuǎn)成字符串請(qǐng)求body參數(shù)

          4.Axios API

          Axios API非常類似于fetch API,只是做了一些改進(jìn)。我個(gè)人更喜歡使用Axios API而不是fetch() API,原因如下:

          • 為GET 請(qǐng)求提供 axios.get(),為 POST 請(qǐng)求提供 axios.post()等提供不同的方法,這樣使我們的代碼更簡(jiǎn)潔。
          • 將響應(yīng)代碼(例如404、500)視為可以在catch()塊中處理的錯(cuò)誤,因此我們無(wú)需顯式處理這些錯(cuò)誤。
          • 它提供了與IE11等舊瀏覽器的向后兼容性
          • 它將響應(yīng)作為JSON對(duì)象返回,因此我們無(wú)需進(jìn)行任何解析

          4.1 示例:GET

          // 在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,我們必須顯式處理它們。

          4.2 示例:POST

          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


          主站蜘蛛池模板: 国产精品一区二区av不卡| 亚洲综合无码一区二区| 3d动漫精品啪啪一区二区中文| 夜夜嗨AV一区二区三区| 国产精品亚洲一区二区在线观看| 国产vr一区二区在线观看| 日本无码一区二区三区白峰美| 久久一区二区精品综合| 亚洲片一区二区三区| 午夜视频在线观看一区二区| 无码人妻精品一区二区三18禁| 中文字幕久久亚洲一区| 清纯唯美经典一区二区| 一区二区三区影院| 国产在线观看91精品一区| 激情无码亚洲一区二区三区| 亚洲一本一道一区二区三区| 亚洲一区二区三区在线| 国产91久久精品一区二区| 亚洲视频在线一区二区三区| 亚洲制服丝袜一区二区三区| 亚洲美女一区二区三区| 亚洲综合一区二区| AV鲁丝一区鲁丝二区鲁丝三区| 激情亚洲一区国产精品| 国产精品高清视亚洲一区二区| 亚洲熟妇av一区| 无码一区二区三区免费视频| 夜夜精品视频一区二区| 日韩视频一区二区| 色一情一乱一伦一区二区三区日本 | 国产一区二区三区电影| 国产一区中文字幕在线观看 | 日韩精品一区二区三区中文字幕| 日韩一区二区三区射精| 久久se精品一区二区| 国产一区二区高清在线播放| 无码人妻精品一区二区三区在线| 精品无码人妻一区二区三区品 | 久久久久久一区国产精品| 亚洲一区二区三区无码中文字幕|