情景:

​ 因为 servletreq.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 懒得重新截图了)

image-20210913161025298

结构还是很清晰的,我们照常用 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插件 转换以后的显示结果如下:

image-20210913164726922

我们发现之前的对象数组已经转换成了 JSON 字符串

后端使用req.getParameter("footList") 接收,因为前端已经将其转换为字符串了,所以提取的形式就是 key:value了, 结果如下:

image-20210913165103768

后端输出的是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);

结果:

image-20210913174303176

最后修改:2021 年 09 月 16 日 05 : 54 PM