JSON数据存在集合,如何转化出你想要的数据

641 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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;

欢迎大家纠错,或者有更好的方式,也可以跟我推荐一下