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;
复制代码
欢迎大家纠错,或者有更好的方式,也可以跟我推荐一下
评论