在热衷于开发爬虫的日子,我一般都是使用Python。但是我第一个自学的语言是Java,工作也是和Java紧密联系。难道是Java不能写爬虫吗,相反我第一个爬虫程序就是使用Java开发的。
至于为什么投入Python的怀抱,今天写完这篇对于Java中各种常见JSON库的使用,可能就知道其中答案了。
我在Java开发中遇到过的Json库有:Fastjson、Jackson、Gson。在用Java的Json的库的时候,免不了都要创建和json字符串对应的实体类。这里我们就先用我在一次爬虫中获取的部分json字符串,来探究各个Json库的使用。
{
"data": [
{
"cid": "mzc00200gw2ez0b",
"name": "画江湖之不良人 第5季",
"title": "知白守黑,和光同尘",
"score": "9.7",
"promoter_score": "0.9745618",
"evaluate_number": "444246",
"type_": "3",
"year": "2022",
"tag_text": "VIP",
"main_genres": "",
"hotval": "10486热度",
"episode_all": "12",
"dimension": "0.8823242,0.07082337,0.027552303,0.009560019,0.009740099",
"update_notify_desc": "会员看全集",
"update_time": "2024-01-24",
"cover_description": "娆疆一行归来,李嗣源已称监国,借天子之名四处绞杀不良人,而身为天子的李星云也即将面临一个新的选择……"
},
{
"cid": "mzc00200y9i58mv",
"name": "伍六七之玄武国篇",
"title": "最强首席,开启奇险之旅!",
"score": "9.6",
"promoter_score": "0.96010125",
"evaluate_number": "126015",
"type_": "3",
"year": "2021",
"tag_text": "VIP",
"main_genres": "冒险,搞笑,战斗",
"hotval": "8391热度",
"episode_all": "10",
"dimension": "0.8206087,0.12071579,0.03859858,0.010800301,0.009276673",
"update_notify_desc": "限时免费",
"update_time": "2024-01-24",
"cover_description": "为了保护小鸡岛居民和这里平静的生活,伍六七和他的伙伴大保和小飞开启了去往玄武国的冒险旅程,去寻找身世的真相和解救小岛的办法,等待他们的又将是更多的未知与奇遇。"
}
],
"count": 238
}
然后就是根据json的层级创建实体类,。首先定义data中的list代表的实体类。
@Setter
@Getter
public class CartoonDomain {
private String cid;
private String name;
private String title;
private String score;
private String promoter_score;
private String evaluate_number;
private String type_;
private String year;
private String tag_text;
private String main_genres;
private String hotval;
private String episode_all;
private String dimension;
private String update_notify_desc;
private String update_time;
private String cover_description;
}
@Setter和@Getter是使用了lombok插件,这样就会自己生成set和get方法。然后再定义json中第一层级的实体类。
@Setter
@Getter
public class DataInfo {
private int count;
private List<CartoonDomain> data;
}
这样,Json字符串中的字段就和Java实体类进行了映射,接着看看三个Json类如何解析这个Json字符串。
FastJson是阿里巴巴开发维护的一个json库,我是在大学时在舍友的推荐的使用的。也是我在大学还有工作的初期最喜欢使用的json库,在开发过程中,使用Fastjson能够简化和加快JSON数据的处理。
我在大学刚接触到Json这种数据格式的时候,我甚至连Json都不知道,现在唯一记得就是被JsonObject支配的恐惧。幸亏FastJson提供了简单易用的API,能快速在Java对象和JSON格式之间来回转换。
看看如何使用FastJson如何解析上面的json。
DataInfo dataInfo = JSON.parseObject(jsonString, DataInfo.class);
仅仅使用了一行代码,就将具有复杂类型的json字符串转换成java类,运行程序。
但是后来屡屡被曝出来安全漏洞的问题。虽然生产是在内网环境,但是还是需要去替换众多服务器的fastsjon依赖,我记得是曝出过两次,后来我就转投Gson门下,虽然后来又开发了一个fastjon2,但是就一直没怎么用..
Gson是由Google开发的一个Json库,使用起来也是非常简单,同样用Gson来解析上面的json字符串。
Gson gson = new Gson();
DataInfo dataInfo = gson.fromJson(jsonString, DataInfo.class);
创建了Gson实例之后,一行代码也实现了json字符串的转换,运行代码结果如下。
如果想要将dataInfo实例,转换成json字符串,那么再加一行代码就够了:
gson.toJson(dataInfo);
运行代码结果如下:
同时,Gson还支持自定义并注册自定义TypeAdapter,来对特定类型的空值处理。所以说,后来Gson成了我的最爱。。
在Springboot中,就使用Jackson作为默认的JSON序列化和反序列化库,Jackson也提供了与Spring框架非常完善的集成。
我们在Controller中使用 @RequestBody 将前台请求json数据转换成javabean,使用 @ResponseBody 将controller返回的javabean响应数据转换成json,都是通过JackSon来完成的。
我们看看用JackSon如何实现json字符串的解析:
ObjectMapper mapper = new ObjectMapper();
DataInfo dataInfo = mapper.readValue(jsonString, DataInfo.class);
同样是很少的代码量,完成了字符串的解析。
在Fastjson中讲到刚认识json时,遇到的阴影JsonObject。我看看了我的笔记,是一个叫org.json的类。研究了一下如何使用org.json来解析之前的json。
JSONObject jsonObject = new JSONObject(jsonString);
int count = jsonObject.getInt("count");
JSONArray data = jsonObject.getJSONArray("data");
System.out.println(count);
System.out.println(data.get(0));
可以看到整个代码中没有使用之前定义的实体类,普通类型就是用get()获取对应类型,list类型就用getJSONArray来转换成JSONArray,但是我想获取映射成javabean,使用其中的某个字段,整个就比较麻烦。
执行程序输出:
对于pyhon来说,解析上面的字符串就超级简单:
import json
json_ = json.loads(jsonString)
json_['data'][0]['cover_description']
使用json的loads将字符串转换成dict,通过key直接就能获取数据。
对于json解析,Java和Python这不是代码量差不多吗,但是,Java需要创建实体类,一个两个Json格式还好,如果十个二十个呢。现在爬虫请求数据,很多都是返回json格式,json解析的简易性也是我选择python的原因之一。
那么,能不能让Java自动创建json实体类呢?这个下一篇文章写。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。