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