Java中item.getString()输出[object Object]及Ajax传JSON+表单数据问题
解决Multipart表单同时传递JSON数据时出现[object Object]的问题
我懂你现在碰到的麻烦——原本能正常处理multipart表单的Servlet,在尝试同时传JavaScript对象时,拿到的结果却是[object Object]。这其实是因为FormData的append方法不会自动帮你序列化JS对象,直接传对象的话它只会调用对象的toString()方法,结果就是这个眼熟的字符串。
下面是具体的解决步骤:
第一步:前端将JS对象序列化为JSON字符串
你需要把fileSeqMapperMember和fileSeqMapperAdvisor这类对象转成JSON格式的字符串,再添加到FormData里。修改你的JS代码:
var fileSeqMapperMember = {}; var fileSeqMapperAdvisor = {}; $("div_member :input").each(function () { var id = this.id; fileSeqMapperMember[id.substring(13, id.length)] = $(this).val(); }); // 关键操作:把JS对象转成JSON字符串再append data.append("fileMapperMember", JSON.stringify(fileSeqMapperMember)); // 同理处理另一个对象 data.append("fileMapperAdvisor", JSON.stringify(fileSeqMapperAdvisor));
第二步:Servlet中解析JSON字符串
现在Servlet拿到的是标准JSON字符串,你需要用JSON解析库(比如Gson或Jackson)把它转成Java对象/Map。
示例1:用Gson解析为Map
如果你的JSON是键值对结构,直接转成Map<String, String>最便捷:
// 假设用Apache Commons FileUpload处理multipart数据 List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for (FileItem item : items) { if (item.isFormField()) { String fieldName = item.getFieldName(); if ("fileMapperMember".equals(fieldName)) { // 获取JSON字符串 String jsonStr = item.getString(); // 用Gson解析为Map Gson gson = new Gson(); Map<String, String> fileMapperMember = gson.fromJson(jsonStr, new TypeToken<Map<String, String>>() {}.getType()); // 现在就能正常使用这个Map了 System.out.println(fileMapperMember); } } else { // 文件上传的处理逻辑和之前保持一致即可 } }
示例2:用Jackson解析为自定义Java对象
如果有对应的实体类(比如FileSeqMapperMember),可以直接转成实体对象:
// 先定义对应实体类 public class FileSeqMapperMember { private String yourField; // 对应JS对象的字段,getter/setter方法省略 } // 在Servlet中解析 ObjectMapper objectMapper = new ObjectMapper(); FileSeqMapperMember member = objectMapper.readValue(jsonStr, FileSeqMapperMember.class);
额外注意事项
- 确保项目中引入了JSON解析库的依赖:比如Gson的Maven依赖,或者Jackson的
jackson-databind依赖。 - JS对象要保证能被
JSON.stringify()正常序列化,不要包含循环引用或不可序列化的属性(比如DOM元素)。 - 如果使用Servlet 3.0及以上版本,也可以用
request.getPart("fileMapperMember")获取表单项,再通过输入流读取JSON字符串:Part part = request.getPart("fileMapperMember"); String jsonStr = new String(part.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
内容的提问来源于stack exchange,提问作者Naman Khandelwal
相关产品推荐
相关产品推荐

