本文目錄一覽:
處理和響應JSON數據
處理和響應JSON數據
使用 HTTP POST 方法傳到網站服務器的數據格式可以有很多種,比如「獲取POST方法傳送的數據」課程中講到的name=Loenpassword=loveyou這種用過符號分割的key-value鍵值對格式。我們也可以用JSON格式、XML格式。相比XML的重量、規範繁瑣,JSON顯得非常小巧和易用。
如果POST的數據是JSON格式,request.json會自動將json數據轉換成Python類型(字典或者列表)。
編寫server.py:
from flask import Flask, request
app = Flask(“myapp”)
@app.route(‘/add’, methods=[‘POST’])
def add():
print(request.headers)
print(type(request.json))
print(request.json)
result = request.json[‘n1’] + request.json[‘n2’]
return str(result)
if __name__ == ‘__main__’:
app.run(host=’127.0.0.1′, port=5000, debug=True)
編寫client.py模擬瀏覽器請求:
import requests
json_data = {‘n1’: 5, ‘n2’: 3}
r = requests.post(“”, json=json_data)
print(r.text)
運行server.py,然後運行client.py,client.py 會在終端輸出:
注意,請求頭中Content-Type的值是application/json。
響應JSON
響應JSON時,除了要把響應體改成JSON格式,響應頭的Content-Type也要設置為application/json。
編寫server.py:
from flask import Flask, request, Response
import json
app = Flask(“myapp”)
@app.route(‘/add’, methods=[‘POST’])
def add():
result = {‘sum’: request.json[‘n1’] + request.json[‘n2’]}
return Response(json.dumps(result), mimetype=’application/json’)
if __name__ == ‘__main__’:
app.run(host=’127.0.0.1′, port=5000, debug=True)
修改後運行。
編寫client.py:
import requests
json_data = {‘n1’: 5, ‘n2’: 3}
r = requests.post(“”, json=json_data)
print(r.headers)
print(r.text)
運行client.py,將顯示:
client終端返回的第一段內容是服務器的響應頭,第二段內容是響應體,也就是服務器返回的JSON格式數據。
另外,如果需要服務器的HTTP響應頭具有更好的可定製性,比如自定義Server,可以如下修改add()函數:
@app.route(‘/add’, methods=[‘POST’])
def add():
result = {‘sum’: request.json[‘n1’] + request.json[‘n2’]}
resp = Response(json.dumps(result), mimetype=’application/json’)
resp.headers.add(‘Server’, ‘python flask’)
return resp
client.py運行後會輸出:
{‘Content-Type’: ‘application/json’, ‘Content-Length’: ’10’, ‘Server’: ‘python flask’, ‘Date’: ‘Wed, 11
Sep 2019 09:09:18 GMT’}
{“sum”: 8}
響應JSON
使用 jsonify 工具函數。
from flask import Flask, request, jsonify
app = Flask(“myapp”)
@app.route(‘/add’, methods=[‘POST’])
def add():
result = {‘sum’: request.json[‘n1’] + request.json[‘n2’]}
return jsonify(result)
if __name__ == ‘__main__’:
app.run(host=’127.0.0.1′, port=5000, debug=True)
運行結果:
在 java web開發中怎麼使用json?
一、JSON建構有兩種結構:
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組2種結構,通過這兩種結構可以表示各種複雜的結構
1、對象:對象在js中表示為「{}」括起來的內容,數據結構為 {key:value,key:value,…}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。在Java中就是一種Map結構。
2、數組:數組在js中是中括號「[]」擴起來的內容,數據結構為 [“java”,”javascript”,”vb”,…],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。在Java中是一種list結構。
經過對象、數組2種結構就可以組合成複雜的數據結構了。
二、Json in Javascript
使用Json語法創建對象
var people = {“name”:”jack”,”sex”:”mail”};
可以通過這種語法創建json對象,用「{}」括起來,用「,」隔開key:value
使用Json語法創建數組
var arr =[value1,value2…];
一個包含多個people的數組 peoples = [{“name”:”jack”,”sex”:”mail”},
“name”:”lily”,”sex”:”femail”};
Json數組可以通過這種語法創建,用”[]”括起來,數組元素之間用「,」分隔開,下面是這種語法的示意圖:
在使用Json格式字符串與服務器交互時候,可以利用Json擴展的方法將字符串轉換成一個JavaScript對象,或者將一個對象轉換成Json格式字符串。不過先要登錄下載Json2.js文件。引入該包後,js對象直接用toJSONString()裝換為字符串格式,字符串可以用parseJSON()轉換成js對象。
訪問數據
只需用點號表示法來表示數組元素。所以,要想訪問 上面peoples列表的第一個條目的名字,只需在 JavaScript 中使用下面這樣的代碼:
peoples[0].name
利用這樣的語法,可以處理任何 JSON 格式的數據,而不需要使用任何額外的 JavaScript 工具包或 API。
修改數據
正如可以用點號和方括號訪問數據,也可以按照同樣的方式輕鬆地修改數據:
peoples[0].name = “Rachmaninov”;
在將字符串轉換為 JavaScript 對象之後,就可以像這樣修改變量中的數據。
如何使用JSON格式 POST數據到服務器
1. JSON的數據格式a) 按照最簡單的形式,可以用下面這樣的 JSON 表示名稱/值對:{ “firstName”: “Brett” }b) 可以創建包含多個名稱/值對的記錄,比如:{ “firstName”: “Brett”, “lastName”:”McLaughlin”, “email”: “brett@newInstance.com” }c) 可以創建值的數組{ “people”: [ { “firstName”: “Brett”, “lastName”:”McLaughlin”, “email”: “brett@newInstance.com” }, { “firstName”: “Jason”, “lastName”:”Hunter”, “email”: “jason@servlets.com” }]}d) 當然,可以使用相同的語法表示多個值(每個值包含多個記錄):{ “programmers”: [ { “firstName”: “Brett”, “lastName”:”McLaughlin”, “email”: “brett@newInstance.com” }, { “firstName”: “Jason”, “lastName”:”Hunter”, “email”: “jason@servlets.com” } ],”authors”: [ { “firstName”: “Isaac”, “lastName”: “Asimov”, “genre”: “science fiction” }, { “firstName”: “Tad”, “lastName”: “Williams”, “genre”: “fantasy” }],”musicians”: [ { “firstName”: “Eric”, “lastName”: “Clapton”, “instrument”: “guitar” }]}注意,在不同的主條目(programmers、authors 和 musicians)之間,記錄中實際的名稱/值對可以不一樣。JSON 是完全動態的,允許在 JSON 結構的中間改變表示數據的方式。
2. 在 JavaScript 中使用 JSONJSON 是 JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON 數據不需要任何特殊的 API 或工具包。
2.1 將 JSON 數據賦值給變量例如,可以創建一個新的 JavaScript 變量,然後將 JSON 格式的數據字符串直接賦值給它:var people = { “programmers”: [ { “firstName”: “Brett”, “lastName”:”McLaughlin”, “email”: “brett@newInstance.com” }, { “firstName”: “Jason”, “lastName”:”Hunter”, “email”: “jason@servlets.com” } ], “authors”: [ { “firstName”: “Isaac”, “lastName”: “Asimov”, “genre”: “science fiction” }, { “firstName”: “Tad”, “lastName”: “Williams”, “genre”: “fantasy” } ], “musicians”: [ { “firstName”: “Eric”, “lastName”: “Clapton”, “instrument”: “guitar” } ] }
2.2 訪問數據將這個數組放進 JavaScript 變量之後,就可以很輕鬆地訪問它。實際上,只需用點號表示法來表示數組元素。所以,要想訪問 programmers 列表的第一個條目的姓氏,只需在JavaScript 中使用下面這樣的代碼:people.programmers[0].lastName;注意,數組索引是從零開始的。
2.3 修改 JSON 數據正如訪問數據,可以按照同樣的方式修改數據:people.musicians[1].lastName = “Rachmaninov”;
2.4 轉換回字符串a) 在 JavaScript 中這種轉換也很簡單:String newJSONtext = people.toJSONString();b) 可以將任何 JavaScript 對象轉換為 JSON 文本。並非只能處理原來用 JSON 字符串賦值的變量。為了對名為 myObject 的對象進行轉換,只需執行相同形式的命令:String myObjectInJSON = myObject.toJSONString();說明:將轉換回的字符串作為Ajax調用的字符串,完成異步傳輸。小結:如果要處理大量 JavaScript 對象,那麼 JSON 幾乎肯定是一個好選擇,這樣就可以輕鬆地將數據轉換為可以在請求中發送給服務器端程序的格式。
3. 服務器端的 JSON3.1 將 JSON 發給服務器a)
通過 GET 以名稱/值對發送 JSON在 JSON 數據中會有空格和各種字符,Web 瀏覽器往往要嘗試對其繼續編譯。要確保這些字符不會在服務器上(或者在將數據發送給服務器的過程中)引起混亂,需要在JavaScript的escape()函數中做如下添加:var url = “organizePeople.php?people=” + escape(people.toJSONString());request.open(“GET”, url, true);request.onreadystatechange = updatePage;request.send(null);b) 利用 POST 請求發送 JSON 數據當決定使用 POST 請求將 JSON 數據發送給服務器時,並不需要對代碼進行大量更改,如下所示:var url = “organizePeople.php?timeStamp=” + new Date().getTime();request.open(“POST”, url, true);request.onreadystatechange = updatePage;request.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);request.send(people.toJSONString());注意:賦值時格式必須是var msg=eval(‘(‘ + req.responseText + ‘)’);
3.2 在服務器上解釋 JSONa) 處理 JSON 的兩步驟。 針對編寫服務器端程序所用的語言,找到相應的 JSON 解析器/工具箱/幫助器 API。 使用 JSON 解析器/工具箱/幫助器 API 取得來自客戶機的請求數據並將數據轉變成腳本能理解的東西。 b) 尋找 JSON 解析器尋找 JSON 解析器或工具箱最好的資源是 JSON 站點。如果使用的是 Java servlet,json.org 上的 org.json 包就是個不錯的選擇。在這種情況下,可以從 JSON Web 站點下載 json.zip 並將其中包含的源文件添加到項目構建目錄。編譯完這些文件後,一切就就緒了。對於所支持的其他語言,同樣可以使用相同的步驟;使用何種語言取決於您對該語言的精通程度,最好使用您所熟悉的語言。c) 使用 JSON 解析器一旦獲得了程序可用的資源,剩下的事就是找到合適的方法進行調用。如果在 servlet 中使用的是 org.json 包,則會使用如下代碼:public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer jb = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) jb.append(line); } catch (Exception e) { //report an error } try { JSONObject jsonObject = new JSONObject(jb.toString()); } catch (ParseException e) { // crash and burn throw new IOException(“Error parsing JSON request string”); } // Work with the data using methods like… // int someInt = jsonObject.getInt(“intParamName”); // String someString = jsonObject.getString(“stringParamName”); // JSONObject nestedObj = jsonObject.getJSONObject(“nestedObjName”); // JSONArray arr = jsonObject.getJSONArray(“arrayParamName”); // etc…}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/188775.html