Json传对象数组到后台并转化成Java对象数组

来源:互联网 发布:sql数据迁移解决方案 编辑:程序博客网 时间:2024/06/01 20:54

Json传递数据到后来很方便,但是遇到复杂的数据传递,不注意细节会很容易报错。下面就来分享一下我的代码片段吧:

1、我们在做批量处理的时候,都希望传递一个对象数组到后来,这样存入数据库也就很方便了。首先来看一下我前端js代码片段:

function addUser(){
var $users = $("input:checked[name='selectUser']");
var engineers=new Array();
$.each($users,function(i, user) {
var fullName=$(user).attr("data-name");//fullName
var userId=$(user).val();//userId
var quantities=$('#'+userId).val();
var param={"deptId":deptId,"userId":userId,"fullName":fullName,"quantities":quantities,"engId":engId,"engNum":engNum};
console.log(param)
engineers.push(param);
});

以上标红的部分是我定义的一个队列以及Json格式的对象并将对象存入队列。然后就是用ajax将数据传到后台,下面是我初次的代码片段:

$.ajax({
url:window.ctx+'/engineer/to-engineerSelect',
type:"post",
traditional:true,//阻止深度序列化
data:{"engineers":JSON.stringify(engineers)}, 
dataType:"json",
contentType:"application/json; charset=utf-8" ,

success:function(feedback){
console.log(feedback.message)
});

这里值得注意的是红色片段,JSON.stringify(Object)是将对象转化成Json字符串,一定要设置contentType字段为Json,否则传递数据有可能出问题,虽然默认的传递方式会自动匹配,但是自己设置了就会防止没必要的错误。

后台接收数据代码片段:

@RequestMapping(value = "to-engineerSelect")
@ResponseBody
public Feedback toEngineerSelect(HttpServletRequest request, HttpServletResponse response,
@RequestBody List<AddEngineer> engineers) throws IOException {
System.out.println(engineers + "======" + engineers.getClass().getName());
String engId =engineers .get(0).getEngId();

我这里采用的是Spring-MVC框架,然后接收我直接转成对象数组了。然后我的打印有数据,返回的也确实是List对象数组。但是我的第二行用这个数组的对象去取它的属性值的时候就报错了,对象转换错误,直接异常。异常我记得是Json传递过来的是LinkMap对象,里面的对象没法转换成AddEngineer实体类。

2、然后我就想既然前端传递过来的是String类型的数据,那我就用String类型来接吧:

@RequestMapping(value = "to-engineerSelect")
@ResponseBody
public Feedback toEngineerSelect(HttpServletRequest request, HttpServletResponse response,
@RequestBody String engineers) throws IOException {
System.out.println(engineers + "======" + engineers.getClass().getName());

这样打印的数据就是Json格式的数据,但是在我用Json自带的将String类型的Json转化成Java对象的时候就有报错了,说是数据中多了一个e,报101错误。打印的数据是这样的:

engineers=[{"deptId":“70104',"userId":"ea1726365615","fullName":"小花","quantities":”30“,"engId":”01728367635613ea7d“,"engNum":”1373174918293“}];

然后我一看这是Json格式的数据啊,格式正确为何会报错?

3、然后我就猜想是不是多了一个engineers=这个东西,所以我就在前端修改了我的Js,修改如下:

$.ajax({
url:window.ctx+'/engineer/to-engineerSelect',
type:"post",
traditional:true,//阻止深度序列化
data:JSON.stringify(engineers),
dataType:"json",
contentType:"application/json; charset=utf-8" ,

success:function(feedback){
console.log(feedback.message)
});

data部分我直接简化成了JSON.stringify(engineers)。

后台就收代码将Json String类型的转化成list对象数组代码具体如下,这样就没有问题了:

@RequestMapping(value = "to-engineerSelect")
@ResponseBody
public Feedback toEngineerSelect(HttpServletRequest request, HttpServletResponse response,
@RequestBody List<AddEngineer> engineers) throws IOException {
System.out.println(engineers + "======" + engineers.getClass().getName());
Feedback feedback = null;
BigDecimal quantities = new BigDecimal(0);
// BigDecimal totalquantities = new BigDecimal(0);
ObjectMapper objectMapper = new ObjectMapper();
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, AddEngineer.class);
List<AddEngineer> list = objectMapper.readValue(engineers, javaType);

String engId = list.get(0).getEngId();


原创粉丝点击