从mongodb中取出一个可能会缺少key的Array数据类型的数据,生成一个自定义类的列表

本文介绍了如何使用SpringBoot连接MongoDB,处理可能缺失字段的Array数据,将其转换为自定义对象列表,并利用JSON处理缺失键值,以生成月报的Word图片和表格。通过引入org.json库,创建MyJSONObject类来避免因键不存在引发的异常,从而确保程序正常运行。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

前端时间写了一个springboot项目,从mongodb取数据生成月报的一些子图片表格啥的到word的小项目。其中用到从mongodb中取出一个可能会缺少key的Array数据类型的数据,生成一个自定义类的列表。


一、mongodb部分

1、mongodb数据类型

这里的这个key有的没有time,有的没有elapsedTime,有的没有其他的
mongodb的数据

2、springboot连接mongodb

我是使用的MongoTemplate进行mongodb操作的,这里说明一下Criteria拼接sql语句的,查询条件每个人都不一样应该主要是mongoTemplate调用的方法中间的自定义类首先要用ArrayList类型接收这个比较重要

    @Autowired
    MongoTemplate mongoTemplate;
	
	    public Bread test(String errorId, String projectId){


        Criteria criteria = Criteria.where("errorId").is(new ObjectId((String) errorId))
                .andOperator(Criteria.where("projectId").is(new ObjectId((String) projectId)));

        Query query = new Query(criteria);

        Bread event = mongoTemplate.findOne(query, Bread.class, "javascriptevents");


        return event;
    }
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Bread {
    private String id;
    private ArrayList<BreadcrumbArr> breadcrumbs;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BreadcrumbArr {

    private String type;
    private String elapsedTime;
    private String time;
    private String detail;
    private String page;
}

二、对接收到的数据进行处理

在pom中引入org.json依赖,我的依赖。版本我是照着官网最新版来的

		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20220320</version>
		</dependency>

JSONObjec构造方法里面传入一个json类型的字符串对象
其中的MyJSONObject是关键,Array没有中可能没有其中的一个key,但是其他的有的我要留着这里要说一下JSONObject.get(“key”)方法如果这个key找不到。这个方法会报错。且程序停止,我不想让他停止。

	import org.json.JSONObject;

	
    @GetMapping("tranBreadCrumbs")
    public List<Breadcrumb> tranBreadCrumbs(String errorId,String projectId) throws ParseException {

        Bread test = errorService.test(errorId, projectId);

        //对数组进行排序,因为我的项目有需求是按照时间排序,取出前5条
        //你们对service传过来的list操作时,最好也新建一个ArrayList赋值过来。以前吃过亏。
        List<BreadcrumbArr> listB = new ArrayList<>();
        listB.addAll(test.getBreadcrumbs());
        Collections.reverse(listB);

        List<Breadcrumb> list = new ArrayList<>();
        if (listB!=null){
            int id = 1;
            for (BreadcrumbArr breadcrumb : listB) {
            	//这里传入的是json类型的字符串对象,
                JSONObject jsonObject = new JSONObject(breadcrumb);
                //这一步是因为我的数据其实是不固定的,有些键是没有的,但是只要有的键我就留着。
                //所以这里我的解决办法就是新建一个MyJSONObject类对其进行包裹
                MyJSONObject myJSONObject = new MyJSONObject(jsonObject);

                Breadcrumb breadcrumb0=new Breadcrumb();

                breadcrumb0.setId(id);
                breadcrumb0.setType(myJSONObject.get("type"));
                breadcrumb0.setElapsedTime(myJSONObject.get("elapsedTime"));
                breadcrumb0.setTime(myJSONObject.get("time"));
                breadcrumb0.setDetail(myJSONObject.get("detail").replaceAll("\\{|\\}",""));
                breadcrumb0.setPage(myJSONObject.get("page").replaceAll("\\{|\\}",""));

                list.add(breadcrumb0);
                id++;
            }
        }

        List<Breadcrumb> list1 = new ArrayList<>();
        if (list.size()>5){
            list1 = list.subList(0,5);

            return list1;
        }else {

            return list;
        }
    }

MyJSONObject类

public class MyJSONObject {

    private JSONObject myJSONObject;

    public String get(String key){
        try {
            return (String) myJSONObject.get(key);
        }catch (RuntimeException e){
            e.printStackTrace();
            return "";
        }
    }
}

总结

这是第一次写博客,可能会有许多地方写的不好的,写的不对的地方,还请大神一一指点。多多留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值