前后端数据传输的原理解析:
参考博客: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)。
--------------------------这里分割线------------------------------
前期在做项目的过程中,遇到了不少类型的前后端数据传输和转化的问题,可能还会有理解不到位的地方,
所以,文章经过一次又一次的编辑和修改,希望对自己和遇到问题的各位能有帮助。