前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我攻克的技术难题 - 探究Java的Json库之后,我才明白爬虫要用python

我攻克的技术难题 - 探究Java的Json库之后,我才明白爬虫要用python

原创
作者头像
叫我阿柒啊
修改2024-01-28 01:16:49
12800
代码可运行
修改2024-01-28 01:16:49
举报
运行总次数:0
代码可运行

前言

在热衷于开发爬虫的日子,我一般都是使用Python。但是我第一个自学的语言是Java,工作也是和Java紧密联系。难道是Java不能写爬虫吗,相反我第一个爬虫程序就是使用Java开发的。

至于为什么投入Python的怀抱,今天写完这篇对于Java中各种常见JSON库的使用,可能就知道其中答案了。

Java Json

我在Java开发中遇到过的Json库有:Fastjson、Jackson、Gson。在用Java的Json的库的时候,免不了都要创建和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代表的实体类。

代码语言:java
复制
@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中第一层级的实体类。

代码语言:java
复制
@Setter
@Getter
public class DataInfo {
    private int count;
    private List<CartoonDomain> data;
}

这样,Json字符串中的字段就和Java实体类进行了映射,接着看看三个Json类如何解析这个Json字符串。

Fastjon

FastJson是阿里巴巴开发维护的一个json库,我是在大学时在舍友的推荐的使用的。也是我在大学还有工作的初期最喜欢使用的json库,在开发过程中,使用Fastjson能够简化和加快JSON数据的处理。

我在大学刚接触到Json这种数据格式的时候,我甚至连Json都不知道,现在唯一记得就是被JsonObject支配的恐惧。幸亏FastJson提供了简单易用的API,能快速在Java对象和JSON格式之间来回转换。

看看如何使用FastJson如何解析上面的json。

代码语言:java
复制
DataInfo dataInfo = JSON.parseObject(jsonString, DataInfo.class);

仅仅使用了一行代码,就将具有复杂类型的json字符串转换成java类,运行程序。

但是后来屡屡被曝出来安全漏洞的问题。虽然生产是在内网环境,但是还是需要去替换众多服务器的fastsjon依赖,我记得是曝出过两次,后来我就转投Gson门下,虽然后来又开发了一个fastjon2,但是就一直没怎么用..

Gson

Gson是由Google开发的一个Json库,使用起来也是非常简单,同样用Gson来解析上面的json字符串。

代码语言:java
复制
Gson gson = new Gson();
DataInfo dataInfo = gson.fromJson(jsonString, DataInfo.class);

创建了Gson实例之后,一行代码也实现了json字符串的转换,运行代码结果如下。

如果想要将dataInfo实例,转换成json字符串,那么再加一行代码就够了:

代码语言:java
复制
gson.toJson(dataInfo);

运行代码结果如下:

同时,Gson还支持自定义并注册自定义TypeAdapter,来对特定类型的空值处理。所以说,后来Gson成了我的最爱。。

Jackson

在Springboot中,就使用Jackson作为默认的JSON序列化和反序列化库,Jackson也提供了与Spring框架非常完善的集成。

我们在Controller中使用 @RequestBody 将前台请求json数据转换成javabean,使用 @ResponseBody 将controller返回的javabean响应数据转换成json,都是通过JackSon来完成的。

我们看看用JackSon如何实现json字符串的解析:

代码语言:java
复制
ObjectMapper mapper = new ObjectMapper();
DataInfo dataInfo = mapper.readValue(jsonString, DataInfo.class);

同样是很少的代码量,完成了字符串的解析。

org.json

在Fastjson中讲到刚认识json时,遇到的阴影JsonObject。我看看了我的笔记,是一个叫org.json的类。研究了一下如何使用org.json来解析之前的json。

代码语言:java
复制
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,使用其中的某个字段,整个就比较麻烦。

执行程序输出:

Python Json

对于pyhon来说,解析上面的字符串就超级简单:

代码语言:python
代码运行次数:0
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Java Json
    • 定义实体类
      • Fastjon
        • Gson
          • Jackson
            • org.json
            • Python Json
            • 结语
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档