前端传入JSON数组转换对象存入数据库

前言

前端有一个页面,一条数据对应一个后台对象,多条数据就是对应多个对象,用的是JSON数组格式传过来到后台,我刚开始准备用List的方式接收,但是报错,说不支持,不知道为什么,多图片上传的时候也是这样可以的,既然不支持,那项目还是要继续,用FastJson来转换

操作步骤

1. 我是SpringBoot项目,在pom.xml中加入相关的依赖

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.44version>
        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,没错,因为页面是又两个集合的,前端将两个集合做在了一块,一个集合里套着一层集合,所以后台要多做一层循环,按照转换的思路,多创建一个JSONArrayJSONObject对象,再做一层循环,将对应的实体类所需要的值Set进去

注意

由于前端页面的修改和新增都是在同一个页面,所以我这里做了if判断,如果有带ID的,是修改,没有带ID的,是新增

中午搞了一个乌龙,什么乌龙?

  1. 把第二个循环的顺序写反了,他要单独做操作,不应该写在if里面,写在最后,导致插入两条一模一样得数据
  2. tools对象new错位置了,导致了每次新增插入数据库的时候报错,说主键重复的错误,应该在第二个循环里面new,创建两个不同对象在第二个循环中做两次存入操作(因为本来就要存多条)

你可能感兴趣的:(工作中的开发思路,如漩涡的博客)