前后端數據傳輸的原理解析:
參考博客:https://blog.csdn.net/u010900754/article/details/51395529
因為前端(常用的是js),語言是一種弱類型語言,后端假設用的是java,所以這兩種語言之間就沒有完全對應的數據類型,這在傳數據的時候,就會需要一個中間的規則或者協議,來規范數據類型。
一般會使用JSON來將數據打包之后,作為中間媒介,然后分別在前端和后端轉化成相應的數據類型。
再來看為甚是字符串類型的,那是因為前后端的通信都是通過網絡層進行(簡單點的有http協議),網絡層不管接受到什么數據類型,都會看做是字符串。
接下來就是,前后端對數據的解析:
這種用法包括前端和后端:
前端:
1. 轉化為JSON對象方便操作(將json的字符串轉化為js中的對象)
var jsonObj = JSON.parse(str);
得到的是一個json數組對象(js中對應的數據對象),可以通過
for (var key in jsonObj){}
來遍歷數組中的每個對象,其中key表示鍵,jsonObj[key]表示key所對應的值。
問題記載:
在項目中遇到使用這種遍歷方式的時候,在最后會出現一個key=“remove”,value=“undefined”的鍵值對(業務邏輯中並沒有),然后換成遍歷數組的方式就不會出現這種問題了:
//jsonObj是一個json對象組成的數組,每個json對象由多個鍵值對組成 for (var i = 0; i < jsonObj.length; i++) { console.log(jsonObj[i].key); //遍歷每個json對象中的某一個字段 }
2. 轉化為字符串(將js對象轉化成一個json的string類型)
var jsonStr = JSON.stringify(jsonObj) ---------->(常用於Ajax中,將返回的對象數據,轉化為字符串)
后端:需要用到阿里的fastjson包(其他的用法可以參考博客:https://blog.csdn.net/zknxx/article/details/52281220)
在java中,有JSONObject和JSONArray兩個對象,轉string就用它們的toString()函數;轉對象,就用toBean()和toArray()函數。需要注意的是JSONObject必須是string的鍵。
3. map對象轉化為 json字符串對象
String json=JSON.toJSONString(map);
4. json對象轉化為map對象
Map map = JSON.parseObject(json);
其他問題搜集:
1、https://blog.csdn.net/AinUser/article/details/82226738(json格式,key值一定要用 雙引號 包起來)
2、https://blog.csdn.net/a_bang/article/details/51847810(給key添加雙引號的方式,沒試^o^)
問題記載:
后端傳來的數據是一般Java格式的對象列表,在傳到前端進行解析的時候,怎么也解析不對,上面的兩條就是遇到的問題。
最后的解決方案是:
在后端就將數據轉化為JSON格式(需要導入net.sf.json-lib包,如果在后端是List,則需要JSONArray.fromObject轉化成js數組,因為在前端解析的是JSON字符串,所以還需要將JSONArray使用toJSONString轉化為字符串),
在前端正常解析即可(JSON.parse)。
--------------------------這里分割線------------------------------
前期在做項目的過程中,遇到了不少類型的前后端數據傳輸和轉化的問題,可能還會有理解不到位的地方,
所以,文章經過一次又一次的編輯和修改,希望對自己和遇到問題的各位能有幫助。