从mongodb中取出一个可能会缺少key的Array数据类型的数据,生成一个自定义类的列表
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
前端时间写了一个springboot项目,从mongodb取数据生成月报的一些子图片表格啥的到word的小项目。其中用到从mongodb中取出一个可能会缺少key的Array数据类型的数据,生成一个自定义类的列表。
一、mongodb部分
1、mongodb数据类型
这里的这个key有的没有time,有的没有elapsedTime,有的没有其他的
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 ""; } }}
总结
这是第一次写博客,可能会有许多地方写的不好的,写的不对的地方,还请大神一一指点。多多留言交流。