小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1.背景:
在数据处理过程中,标准的JSON是我们所熟知的,但是因为每个需求不一,我们需要将数据分类进行数据清洗和过滤(也就是我们常说的数据转化),但是这些转化中会遇到很多的问题,比如集合数据中的问题,两个集合中数据如何过滤,如何拿到我们需要的数据,(怎么写好条件去管理);
要点:
我选择我平常开发过程中,对于数据格式处理的方式,(欢迎纠错讨论)
场景1:
我们想做一个接口,需求是将别的系统中的数据,同步到我们系统中,可能就有一个字段(相同时间段或者都是手机号相同的人)是相同的?
分析:比如同步商品信息,(淘宝中已经有了,我作为一个店家,我想去京东开店,然后将数据不想在上传一份了,我直接提供一份我淘宝的商品信息,看这个接口怎么支持)
其实这个需求本质上: 将自己获取到的信息过滤成标准的可输入的信息,然后在判断数据有效性之后,进行写库操作;
- 过滤标准获取的信息
- 验证数据有效性
- 进行写库
我们获取到数据之后,一般是一个JSON格式的数据,
一般是一个对象,里面的某一个属性是个集合,例如
{
"id": 1626164850455,
"appID": "084597",
"body": {
"total":2,
"goodInfo": [{
"devName": "测试112",
"devSn": "ceshi_0013434",
"productCode": "834745951011323904",
"factoryName": "ceshi",
"devMajor": "ceshi",
"regionId": 320000,
"isInnerNet": 0,
"devAddr": "121.12.131.210",
"outerId": "ceshinihao"
},
{
"devName": "测试122",
"devSn": "ceshi_023434",
"productCode": "834745951011323904",
"factoryName": "ceshi2",
"devMajor": "ceshi1",
"regionId": 320000,
"isInnerNet": 0,
"devAddr": "121.12.131.210",
"outerId": "ceshinihao"
}]
}
}
比如上图这个JSON格式,如果是一个返回格式中,我们直接去数据data中的数据;
步骤:先获取到data,然后解析里面的数据:
思路:
对于这种JSON,解析的时候,可以将googInfo属性清楚以后,我们可以将类建立起来,然后根据fastJSON的解析对象,整理出来,具体看以下代码:
//其中这个result就是已经返回的JSON数据,是String类型的;
/**
1.将result转化成对象格式
2.将获取到的对象中,data数据解析出来成一个goodInfo的对象数据
*/
JSONObject resultInfo=JSON.parseObject(result.getdata())
/**
这里分为两种情况,一种是里面直接是对象,没有集合数据的,那就直接转成固定的对象就可以
GoodInfo goodInfo=resultInfo.get("goodInfo",GOOdInfo.class)
如果里面是集合,那就需要将集合用jsonArray接收
*/
情况一: 只有一个对象,不是集合时,比如我们查询单个商品的信息
(不用转jsonboject的)
//GoodInfo goodInfo=JSON.parseObject(result.getdata(),GOOdInfo.class)
GoodInfo goodInfo=resultInfo.get("goodInfo",GOOdInfo.class)
//直接是集合类型的
JSONArray goodInfoList= resultInfo.getJSONArray("goodInfo")
goodInfoList.stream().map(a->{
//利用dozer将每个管道中的数据转化成一个标准,对象
Test test=dozerBeanMapper.map(a,Test.class);
return test;
})
我们也可以家一个对于 多个集合数据中,我们的过滤条件,添加在流后面的.filter
其中拿到JSONArray之后,利用stream()流的map方法,中对管道中的每个元素进行转化:
//将数据stream流通过管道服务map解析成单个对象,经过dozermap转化,其中过滤条件是filter()--.collect(Collectors.toList)
List<Test> collect=goodInfo.stream().map(goodInfo->{
Test test=dozerBeanMapper.map(a,Test.class);
return test;
}).filter(goodInfo->stringUtils.isNotEmpty(goodInfo.getName())).collect(Collectors.toList)
直接解析成,获取的信息-解析成对象集合;
上述代码中,对于对象中值dozer是一个开源插件,主要是对于对象中值的相互赋值
我将代码格式pom文件地址放下面:
<dependency>
<groupId>com.github.dozermapper</groupId>
<artifactId>dozer-spring-boot-starter</artifactId>
</dependency>
使用方式:
@Autowired
private DozerMppaer dezerMapper;
欢迎大家纠错,或者有更好的方式,也可以跟我推荐一下