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

前言

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

注意

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

中午搞了一个乌龙,什么乌龙?
  1. 把第二个循环的顺序写反了,他要单独做操作,不应该写在if里面,写在最后,导致插入两条一模一样得数据
  2. tools对象new错位置了,导致了每次新增插入数据库的时候报错,说主键重复的错误,应该在第二个循环里面new,创建两个不同对象在第二个循环中做两次存入操作(因为本来就要存多条)
要将 JSON 数组转换Java 的 List 对象,可以使用 Fastjson 的 `JSON.parseArray()` 方法,示例代码如下: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; // 假设 jsonArrayString 是一个 JSON 数组字符串 try { JSONArray jsonArray = JSON.parseArray(jsonArrayString); List<Object> list = jsonArray.toJavaList(Object.class); // Object.class 为转换后的元素类型 // 转换成功,处理 list // ... } catch (JSONException e) { // 解析失败,处理异常 // ... } ``` 这段代码使用 `JSON.parseArray()` 方法将 jsonArrayString 解析为一个 JSON 数组对象 jsonArray,然后使用 `toJavaList()` 方法将 jsonArray 转换Java 的 List 对象。需要注意的是,`toJavaList()` 方法需要传入转换后的元素类型,如果元素类型是字符串,则可以传入 `String.class`;如果元素类型是自定义的对象,可以传入对象的类型。如果元素类型是基本类型,则可以传入相应的基本类型(如 `int.class`)。 需要注意的是,如果 JSON 数组中的元素类型是复杂类型(如对象数组),则 list 中的元素也是相应的 Java 对象对象或 List)。如果 JSON 数组中的元素类型是基本类型(如字符串、整数等),则 list 中的元素为相应的 Java 类型(如 String、Integer 等)。在使用 list 中的元素时,你需要根据元素的类型来进行转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值