servlet接收对象数组 json

本文探讨了在前后端交互中,Servlet无法直接接收JSON对象数组的问题。通过实例展示了当使用qs插件转换数据时,后端通过`req.getParameter()`和`req.getParameterValues()`无法获取到对象数组。解决方案是前端使用`JSON.stringify()`将对象数组转换为JSON字符串,然后后端利用JSON库如FastJSON进行解析。提供了两种不同的后端解析方法,一种不使用实体类,另一种使用自定义实体类。这种方法成功解决了后端接收并处理JSON数据的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情景:

​ 因为 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值