情景:
因为 servlet
的 req.getParameter
是没有办法接收json的,所以我前端采用的是将 js对象转为表单类型的数据传给后端的 (这里用的是qs插件,具体可以百度),如图所示:
前端是怎么实现的就不做解释了,这种格式 后端只需要用 req.getParameter("phone")
即可接收到手机号码。
问题:
当传输的一个成员为 对象数组 的时候,后端无法正确接受参数,情景数据如下:
{
type:"create"
shopId:1,
addressId:1,
selectFoots:[
{
foodId:1,
foodCount:1
},{
foodId:2,
foodCount:1
}
]
}
数据经过 qs插件 转换以后的显示结果如下(这里的footList 应为 foodList 懒得重新截图了)
结构还是很清晰的,我们照常用 req.getParameter("")
来获取数据;
req.getParameter("shopId");
req.getParameterValues("footList");
req.getParameter("footList");
结果:
1
null
null
我们发现不管是通过 getParameter
还是 getParameterValues
都无法接收 footlist
在网上一番查找后无果。
方案
前端使用 JSON.stringify()
转化js对象
JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
let selectFoots = [
{
foodId:1,
foodCount:1
},{
foodId:2,
foodCount:1
}
];
{
type:"create"
shopId:1,
addressId:1,
selectFoods:JSON.stringify(selectFoods)
}
数据经过 qs插件 转换以后的显示结果如下:
我们发现之前的对象数组已经转换成了 JSON 字符串
后端使用req.getParameter("footList")
接收,因为前端已经将其转换为字符串了,所以提取的形式就是 key:value
了, 结果如下:
后端输出的是JSON字符串,我们可以通过 阿里巴巴的 fastJSON
来格式化 字符串:
方法一(不使用实体类):
String foodList = req.getParameter("foodList"); //获取 foodList对应的json字符串
JSONArray objects = JSON.parseArray(footList); //解析对象数组
JSONObject jsonObject = JSON.parseObject(objects.getString(0)); //获取第一个对象的字符串类型,并解析为JSONObject
Object footCount = jsonObject.get("footCount"); //通过JSONObject的get方法获取字段的值
结果:
方法二(实体类):
定义对应数据字段的实体类
public class FoodInOrder {
private Integer footId;
private Integer footCount;
get...
set...
}
List<FoodInOrder> foodInOrders = JSON.parseArray(foodList, FoodInOrder.class);
System.out.print(foodInOrders);
结果:
评论区