在做微信小程序开发的时候,当将从数据库内查到的多行数据以JSONObject对象包装成JSON数据返回微信小程序时,在前端接收时出现了406错误。
经查询,406错误是因为前端无法解析后台的数据,我是用JSONObject作为返回类型直接返回前端,所以,就报错了,经过七八个小时的查询,终于明白了一件事,JSONObject类型不是JSON字符串数据,不能够被前端直接解析,JSONObject是一个JSON对象,但前端无法解析JSONObject对象,只能解析JSON字符串
@RequestMapping(value = "/FindRoomUsedSeat",produces="text/html;charset=UTF-8")
@ResponseBody
public String FindRoomUsedSeat(@RequestBody String seatdata){
JSONObject jsonGet = JSONObject.fromObject(seatdata);
String send = "";
System.out.println(jsonGet+"get");
String floor = (String)jsonGet.get("floor");
String room = (String)jsonGet.get("room");
List<Map<String, Object>> lists = seatService.FindEveryEmptySeatOfFloorAndRoom(floor,room);
//由于查询出来的数据没有用
JSONArray jsonSend1 = JSONArray.fromObject(lists);//将List类型转化为JSONArray对象,方便转化为JSON字符进行传送
send = jsonSend1.toString();//转换为JSON字符串,进行数据传送
return send;
}
这个是我写的微信小程序的后台代码,在报406错误的时候是没有进行转化的,直接返回的是JSONObject对象,所以前台一直无法解析数据。
还有,用@ResponseBody进行方法返回值的注解时,用HashMap座位返回值,虽说此注解会将Map数据类型转化为JSON类型,但是前台依旧无法解析,所以,将JSONObject对象转化为String类型会减少很多麻烦,类型转化最好在后台解决,切记不要以对象形式传送数据,否则前后台交互会产生很多问题。前端和后端要使用两种语言或者说是着重不同方面,后端的数据处理能力要更强,很多数类型到前端都会无法解析。
还有一个关于SpringMVC 从数据库查询内容的获取的知识点,也是我以前没太注意的地方,我是用的jdbcTemplate进行数据库的操作,而且以前都是对单条数据进行获取,一般都是返回Map类型,只需要用jdbcTemplate.queryForMap()方法即可,但是多条数据的话就没办法返回了,此时,有两种方法:
其一是直接返回List<Map<String, Object>>类型,将Map直接放到一个List集合中,接收的话可以直接使用一个List<Map<String, Object>>进行接收,
List<Map<String, Object>> list = seatService.FindEveryEmptySeatOfFloorAndRoom(floor,room);//接收数据
若要发往前端,可进行简单处理如下
JSONArray jsonSend1 = JSONArray.fromObject(list);//将List类型转化为JSONArray对象,方便转化为JSON字符进行传送
send = jsonSend1.toString();//转换为JSON字符串,进行数据传送
若不进行数据传送,遍历即可获取数据如下
for (Map<String, Object> map:lists){
System.out.println(map);
}
其二是将返回类型封装成为对象,然后封装进List集合中,例如List类型,若是要向前端传送数据的话,用JSONArray将其转化为JSON对象,然后转化为JSON 字符串类型