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

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


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


前言

前端时间写了一个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@NoArgsConstructorpublic class Bread {    private String id;    private ArrayList<BreadcrumbArr> breadcrumbs;}
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic 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 ""; }    }}

总结

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