java解析json复杂数据补充
文章目录
- 一、概述
- 二、编码实现
- 1. 新建data.json数据
- 2. 编写单元测试
- 3. 运行结果
- 三,源码放送
一、概述
在java解析json复杂数据的两种思路 一文中,我们提到 将JSON字符串转化为JavaBean的方案。
注意到需保证实体属性与json key全部严格对应,其实jackson也支持解析时忽略无法识别字段
二、编码实现
由于csdn加强了接口调用的防爬控制,无法直接获取接口数据,现采取读取数据文件的方式。
1. 新建data.json数据
{"code": 200,"message": "success","traceId": "cda06828-d9ab-4eb9-b743-11f284a4e4b4","data": {"list": [{"articleId": 139042649,"title": "CSDN博客自动阅读器-服务端推送技术SSE之简单应用","description": "接上篇springboot实现SSE之牛刀小试我们已经了解了SSE技术的优缺点以及来龙去脉,下面我们以SSE技术来实现一个简单的博客文章阅读器。","url": "https://blog.csdn.net/qq_16127313/article/details/139042649","type": 1,"top": false,"forcePlan": false,"viewCount": 274,"commentCount": 0,"editUrl": "https://editor.csdn.net/md?articleId=139042649","postTime": "2024-05-19 15:04:13","diggCount": 3,"formatTime": "19 小时前","picList": ["https://img-blog.csdnimg.cn/direct/bf448120ffaf4d00bc93b2305791b9a4.jpeg"],"collectCount": 3},{"articleId": 138968138,"title": "springcloud微服务牛刀小试开篇:示例概述","description": "尽管Spring Cloud带有“Cloud”的字样,但它并不是云计算解决方案,而是在Spring Boot基础上构建的,用于快速构建分布式系统的通用模式的工具集。使用Spring Cloud开发的应用程序非常适合在Docker或者PaaS(例如Cloud Foundry)上部署,所以又叫做云原生应用(Cloud Native Application)。下面以一个简单示例来介绍如何搭建一套微服务系统。","url": "https://blog.csdn.net/qq_16127313/article/details/138968138","type": 1,"top": false,"forcePlan": false,"viewCount": 610,"commentCount": 0,"editUrl": "https://editor.csdn.net/md?articleId=138968138","postTime": "2024-05-16 17:59:47","diggCount": 9,"formatTime": "2024.05.16","picList": ["https://img-blog.csdnimg.cn/direct/08cfa2f4cb534cf199c79002b455efed.png"],"collectCount": 25},{"articleId": 138337724,"title": "基于缓存注解的时间戳令牌防重复提交设计","description": "API接口由于需要供第三方服务调用,所以必须暴露到外网,并提供了具体请求地址和请求参数。为了防止重放攻击必须要保证请求仅一次有效比较成熟的做法有批量颁发时间戳令牌,每次请求消费一个令牌。/*** @version [版本号, 2019年12月18日]* @see [相关类/方法]* @since [产品/模块版本]","url": "https://blog.csdn.net/qq_16127313/article/details/138337724","type": 1,"top": false,"forcePlan": false,"viewCount": 2204,"commentCount": 2,"editUrl": "https://editor.csdn.net/md?articleId=138337724","postTime": "2024-04-30 12:03:24","diggCount": 17,"formatTime": "2024.04.30","picList": ["https://img-blog.csdnimg.cn/direct/fd4f0d49b87943deb9d89a08baefab93.png"],"collectCount": 13},{"articleId": 138240421,"title": "基于自定义注解、切面实现的WebApi接口","description": "某自研系统,已有完善的业务接口,现在需要开放一部分web接口做对外服务,需要加入鉴权、防重放、限流、防篡改等功能,请给出一个合理的设计方案。OpenApi/*** 开放API注解/*** 检查项/*** 开放API注解/*** 检查项/*** 开放API注解/*** 检查项Documented;/*** 开放API注解/*** 检查项/*** 开放API注解/*** 检查项/**","url": "https://blog.csdn.net/qq_16127313/article/details/138240421","type": 1,"top": false,"forcePlan": false,"viewCount": 1746,"commentCount": 0,"editUrl": "https://editor.csdn.net/md?articleId=138240421","postTime": "2024-04-27 11:49:08","diggCount": 10,"formatTime": "2024.04.27","picList": ["https://img-blog.csdnimg.cn/direct/d942fb650ddd4c779adefe18a19bbb05.png"],"collectCount": 22},{"articleId": 138239036,"title": "【邻里噪音攻略】","description": "#邻里噪音攻略","url": "https://blog.csdn.net/qq_16127313/article/details/138239036","type": 2,"top": false,"forcePlan": false,"viewCount": 1092,"commentCount": 0,"editUrl": "https://editor.csdn.net/md?articleId=138239036","postTime": "2024-04-27 08:59:57","diggCount": 0,"formatTime": "2024.04.27","picList": ["https://img-blog.csdnimg.cn/direct/657e47b114e04df1871aebecb026ba80.png"],"collectCount": 0}],"total": 102}
}
2. 编写单元测试
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;import lombok.Data;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class ParseJsonIgnoreError
{/*** 解析为实体* * @throws IOException*/@Testpublic void testToEntity()throws IOException{ObjectMapper objectMapper = new ObjectMapper();objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略无法识别字段BlogData blogData = objectMapper.readValue(getJsonData(), BlogData.class);log.info("blogData: {} ", blogData);}/*** 获取jsonData* * @return* @throws IOException*/private String getJsonData()throws IOException{Resource resource = new ClassPathResource("data.json");try (InputStream input = resource.getInputStream()){return IOUtils.toString(input, StandardCharsets.UTF_8);}}
}@Data
class BlogData
{private Record data;
}@Data
class Record
{private List<Article> list;
}@Data
class Article
{String title;String url;Long viewCount;
}
3. 运行结果
2024-05-20 17:56:48.722 [main] INFO com.fly.json.ParseJsonIngoreError - blogData: BlogData(data=Record(list=[Article(title=CSDN博客自动阅读器-服务端推送技术SSE之简单应用, url=https://blog.csdn.net/qq_16127313/article/details/139042649, viewCount=274), Article(title=springcloud微服务牛刀小试开篇:示例概述, url=https://blog.csdn.net/qq_16127313/article/details/138968138, viewCount=610), Article(title=基于缓存注解的时间戳令牌防重复提交设计, url=https://blog.csdn.net/qq_16127313/article/details/138337724, viewCount=2204), Article(title=基于自定义注解、切面实现的WebApi接口, url=https://blog.csdn.net/qq_16127313/article/details/138240421, viewCount=1746), Article(title=【邻里噪音攻略】, url=https://blog.csdn.net/qq_16127313/article/details/138239036, viewCount=1092)]))
三,源码放送
https://gitcode.com/00fly/csdn-reader/blob/main/src/test/java/com/fly/json/ParseJsonIgnoreError.java
git clone https://gitcode.com/00fly/csdn-reader.git
有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!
-over-