前言
前端有一个页面,一条数据对应一个后台对象,多条数据就是对应多个对象,用的是JSON数组格式传过来到后台,我刚开始准备用List的方式接收,但是报错,说不支持,不知道为什么,多图片上传的时候也是这样可以的,既然不支持,那项目还是要继续,用FastJson来转换
操作步骤
1. 我是SpringBoot项目,在pom.xml中加入相关的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
2. 写代码
public void add(String vo, String id) {
JSONArray array = JSON.parseArray(vo);
EdTemplateField edTemplateField;
EdFieldColumns edFieldColumns;
EdFieldTools edFieldTools = null;
for (int i = 0; i < array.size(); i++) {
JSONObject object = array.getJSONObject(i);
edTemplateField = new EdTemplateField();
edFieldColumns = new EdFieldColumns();
edTemplateField.setName(object.getString("name"));
edTemplateField.setTemplateId(id);
edTemplateField.setDescription(object.getString("description"));
edFieldColumns.setName(object.getString("type"));
edFieldColumns.setTableName(edTemplateDbconfigMapper.findByTemplate(id).getTableName());
JSONArray toolArr = JSON.parseArray(object.getString("toolArr"));
if (object.getString("id") != null && !"".equals(object.getString("id"))){
edTemplateField.setId(object.getString("id"));
edFieldColumns.setId(edFieldColumnsMapper.findByField(object.getString("id")).get(i).getId());
edFieldColumnsService.update(edFieldColumns);
this.update(edTemplateField);
}else {
this.save(edTemplateField);
edFieldColumns.setFiledId(edTemplateField.getId());
edFieldColumnsService.save(edFieldColumns);
}
if (toolArr == null){
continue;
}
for (int j = 0; j < toolArr.size(); j++) {
edFieldTools = new EdFieldTools();
JSONObject toolObject = toolArr.getJSONObject(j);
edFieldTools.setType(Integer.valueOf(toolObject.getString("toolType")));
edFieldTools.setToolId(toolObject.getString("toolId"));
if (object.getString("id") != null && !"".equals(object.getString("id"))){
edFieldTools.setFieldId(object.getString("id"));
edFieldTools.setId(edFieldToolsMapper.findByField(object.getString("id")).get(i).getId());
edFieldToolsService.update(edFieldTools);
}else {
edFieldTools.setFieldId(edTemplateField.getId());
edFieldToolsService.save(edFieldTools);
}
}
}
}
前端传入参数
description
:
"测试"
fieldType
:
"VARCHAR"
name
:
"测试"
toolArr
:
Array(2)
0
:
{toolId: "051d207148f411e898182a0677dab72a", toolType: "1"}
1
:
{toolId: "4e85a1a7476f11e898182a0677dab72j", toolType: "1"}
length
:
2
__proto__
:
Array(0)
type
:
"basin_code"
说明
参数中String的对象vo就是前端传的JSON数组,创建JSONArray
对象转换数组,循环这个对象长度,创建JSONObject
对象,getJSONObject(i)
创建多个对象,因为前端传的不止一条数据,多条数据那就是多个对象,接着将准备好的数据库实体类实例化,用 object.getString
的方法,获取前端JSON数组的值,塞到实体类中
但是,细心的同学会发现,这个JSON数组里又嵌入了一层数组,toolArr,没错,因为页面是又两个集合的,前端将两个集合做在了一块,一个集合里套着一层集合,所以后台要多做一层循环,按照转换的思路,多创建一个JSONArray
和JSONObject
对象,再做一层循环,将对应的实体类所需要的值Set进去
注意
由于前端页面的修改和新增都是在同一个页面,所以我这里做了if
判断,如果有带ID的,是修改,没有带ID的,是新增
中午搞了一个乌龙,什么乌龙?
- 把第二个循环的顺序写反了,他要单独做操作,不应该写在
if
里面,写在最后,导致插入两条一模一样得数据 - tools对象new错位置了,导致了每次新增插入数据库的时候报错,说主键重复的错误,应该在第二个循环里面new,创建两个不同对象在第二个循环中做两次存入操作(因为本来就要存多条)