写点什么

将 JSON 中对于集合话的数据,如何解析成对象集合

用户头像
卢卡多多
关注
发布于: 2 小时前
将JSON中对于集合话的数据,如何解析成对象集合

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;
复制代码


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


发布于: 2 小时前阅读数: 3
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
将JSON中对于集合话的数据,如何解析成对象集合