Java網路爬蟲(六)--JSON資料的解析
有時候,我們抓取下來一個html頁面,發現瀏覽器頁面可以顯示的東西在html原始碼中卻沒有,這時候我們就要考慮伺服器是以JSON格式將這部分資料傳送到客戶端的,對於這種情況的處理方式我們一般是在chrome的開發者工具中找到對應的JSON包,然後構建其URL,對JSON資料所在的源地址進行訪問,然後使用一些工具對JSON資料進行解析,從而得到我們想要的東西。
阿里巴巴FastJson是一個Json處理工具包,包括“序列化”和“反序列化”兩部分,它具備如下特徵:
速度最快,測試表明,FastJson具有極快的效能,超越任其他的Java Json parser。包括自稱最快的JackJson;功能強大,完全支援Java Bean、集合、Map、日期、Enum,支援範型,支援自省;無依賴,能夠直接執行在Java SE 5.0以上版本;支援Android;開源 (Apache 2.0)
FastJson使用
Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態方法直接完成。
public static final Object parse(String text); // 把JSON文字parse為JSONObject或者JSONArray
public static final JSONObject parseObject(String text); //把JSON文字parse成JSONObject
public static final T parseObject(String text, Class clazz); // 把JSON文字parse為JavaBean
public static final JSONArray parseArray(String text); // 把JSON文字parse成JSONArray
public static final List parseArray(String text, Class clazz); //把JSON文字parse成JavaBean集合
public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文字
public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文字
public static final Object toJSON(Object javaObject); //將JavaBean轉換為JSONObject或者JSONArray。
首先給大家一個我在知乎上看到的有關JavaBean的解釋(看百度百科我也是很迷茫… …)感覺這個很言簡意賅,它就是一個Java類:
1、所有屬性為private
2、提供預設構造方法
3、提供getter和setter
4、實現serializable介面
下來我上具體的程式碼:
/**
* Created by paranoid on 17-4-2.
*/
public class TestPerson {
private int age;
private String name;
public TestPerson() {
}
public TestPerson(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.out;
/**
* Created by paranoid on 17-4-2.
*
* fastJson在反序列化的時候需要呼叫物件的預設構造方法,如果該物件之中還包含其他的物件,
* 那麼都需要建立預設的無參構造方法.
*/
public class TestFastJson {
public static void main(String[] args) {
TestPerson testPerson = new TestPerson(19, "李明");
List<TestPerson> list = new ArrayList<>();
list.add(testPerson);
list.add(new TestPerson(12, "張三"));
//將集合或物件序列化為Json
out.println(JSON.toJSON(testPerson));
out.println(JSON.toJSON(list));
//JSON串反序列化為物件
TestPerson person = JSON.parseObject("{\"age\":19,\"name\":\"李明\"}",
TestPerson.class);
out.printf("name:%s, age:%d\n", person.getName(), person.getAge());
//字串物件反序列化成集合
String str = "[{\"name\":\"李明\",\"age\":19},{\"name\":\"張三\",\"age\":12}]";
List<TestPerson> listPerson = JSON.parseArray(str,TestPerson.class);
for(TestPerson item : listPerson){
out.println(item.getName() );
out.println(item.getAge());
}
//沒有物件直接解析JSON物件(常用)
JSONObject jsonObject = JSON.parseObject("{\"name\":\"李明\",\"age\":19}");
System.out.printf("name: %s, age: %d\n", jsonObject.getString("name"),
jsonObject.getBigInteger("age"));
//沒有物件直接解析JSON陣列
JSONArray jsonArray = JSON.parseArray("[{\"name\":\"李明\",\"age\":19}," +
"{\"name\":\"張三\",\"age\":12}]");
for(int i = 0; i < jsonArray.size(); i++){
JSONObject temp = jsonArray.getJSONObject(i);
System.out.printf("name: %s, age: %d\n", temp.getString("name"),
temp.getBigInteger("age"));
}
for(Object obj : jsonArray){
System.out.println(obj.toString());
}
}
}
參考閱讀
相關推薦
Java網路爬蟲(六)--JSON資料的解析
有時候,我們抓取下來一個html頁面,發現瀏覽器頁面可以顯示的東西在html原始碼中卻沒有,這時候我們就要考慮伺服器是以JSON格式將這部分資料傳送到客戶端的,對於這種情況的處理方式我們一般是在chrome的開發者工具中找到對應的JSON包,然後構建其URL,對
Java網路爬蟲(十)--使用多執行緒提升爬蟲效能的思路小結
在開始說正事之前我先給大家介紹一下這份程式碼的背景,以免大家有一種霧裡看花的感覺。在本系列的前幾篇部落格中有一篇是用多執行緒進行百度圖片的抓取,但是當時使用的多執行緒是非常粗略的,只是開了幾個執行緒讓抓取的速度提升了一些(其實提升了很多),初步的使用了一下執行緒
Java網路爬蟲(八)--使用多執行緒進行百度圖片的抓取
宣告:如需轉載本篇文章,請進行私聊並在文章首處註明出處,本程式碼未經授權不可用於獲取商業價值,否則後果將由自己承擔。 這次的需求大概是從百度圖片裡面抓取任意的分類的圖片,考慮到有些圖片的資源不是很好,並且由於百度搜索越到後面相關度會越來越低,所以我將每個分類要
Java網路爬蟲(七)--實現定時爬取與IP代理池
定點爬取 當我們需要對金融行業的股票資訊進行爬取的時候,由於股票的價格是一直在變化的,我們不可能手動的去每天定時定點的執行程式,這個時候我們就需要實現定點爬取了,我們引入第三方庫quartz的使用: package timeutils; imp
Java網路爬蟲(五)--使用Jsoup的select語法進行元素查詢
使用Jsoup進行元素的查詢有兩種方法。有使用DOM方法來遍歷一個文件,也有使用選擇器語法來查詢元素,而後者類似於CSS或jQuery的語法來查詢和操作元素。對於這兩個方法到底使用哪個感覺好上手我覺得因人而異,在我嘗試了兩種方法之後我還是選擇select,所以我
JAVA網路爬蟲(三):HttpClient獲取HTML
在本爬蟲專案中採用Httpclient來模擬客戶端瀏覽器,訪問並獲取網頁資源。 HttpClient簡介 Http協議是網際網路中最重要的協議之一。雖然JDK中的java.net包提供了一些http的基本方法,可以通過http協議來訪問網路資源,但
網路爬蟲(六):Python中的正則表示式教程
接下來準備用糗百做一個爬蟲的小例子。 但是在這之前,先詳細的整理一下Python中的正則表示式的相關內容。 正則表示式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。 整理時沒有注意,實在抱歉。 一、 正則表示式基礎 1.1.概
【網路爬蟲】【java】微博爬蟲(四):資料處理——jsoup工具解析html、dom4j讀寫xml
之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。 本文介紹兩個工具包:解析html, xml的jsoup,
python網路爬蟲(7)爬取靜態資料詳解
目的 爬取http://seputu.com/資料並存儲csv檔案 匯入庫 lxml用於解析解析網頁HTML等原始碼,提取資料。一些參考:https://www.cnblogs.com/zhangxinqi/p/9210211.html requests請求網頁 chardet用於判斷網頁中的字元編
python網路爬蟲(10)分散式爬蟲爬取靜態資料
目的意義 爬蟲應該能夠快速高效的完成資料爬取和分析任務。使用多個程序協同完成一個任務,提高了資料爬取的效率。 以百度百科的一條為起點,抓取百度百科2000左右詞條資料。 說明 參閱模仿了:https://book.douban.com/subject/27061630/。 作者說是簡單的分散式爬蟲(
java設計模式(六)策略模式
() pan win with blog trac java設計模式 ring ide 策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們可以相互替換,讓算法獨立於使用它的客戶而獨立變化,具體應用場景如第三方支付對接不同銀行的算法。 要點:1)抽象策略角
java學習筆記(六):變量類型
animal 單獨使用 div 位置 fin strong pub 局部變量 變量聲明 java一共三種變量: 局部變量(本地變量):方法調用時創建,方法結束時銷毀 實例變量(全局變量):類創建時創建,類銷毀時銷毀 類變量(靜態變量):程序啟動是創建,程序銷毀時銷毀
爬蟲(六):Selenium庫使用
ide BE domain () tex contain lec send ram 一:Selenium簡介 selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測
Java基礎學習(六) 網絡編程簡介
exc 個數 intern 時間 能夠 兩臺 接受 void connect 基礎知識:1、osi分層模型和TCP/IP分層模型對應關系 2、七層模型與協議的對應關系 網絡層 ------------ IP(網絡之間的互聯協議) 傳
Java開發筆記(六)特殊數字的表達
world 表達 int 數據 decimal stat java語言 細節 進制數 之前的文章提到,Java語言不但支持大眾熟知的十進制數,也支持計算機特有的二進制數、八進制數和十六進制數。可是在給數值變量賦值的時候,等號右邊的數字明顯屬於十進制,那究竟要如何書寫其它進制
Java NIO教程(六)Selector
Java NIO教程(六)Selector Selec
自學python爬蟲(六)PyQuery使用
一、概念 PyQuery庫也是很強大的網頁解析庫,適合熟悉Jquery的人使用,因為PyQuery和Jquery的API幾乎一模一樣。 二、詳細講解 1、初始化 1.1字串初始化 # 字串初始化 html = """ <div> <ul>
python網路爬蟲(一)
網路爬蟲之前奏 網路爬蟲之規則 Requests庫入門 requests庫的安裝 requests的詳細資訊 Win平臺: “以管理員身份執行” cmd,執行pip3 install requests。 requests庫安裝成功與否的測試
JAVA基礎複習(六)泛型和集合
1、泛型的優點是能在編譯時檢測出錯誤,一旦編譯器認為泛型型別是安全使用的,就會將它轉換為原始型別,泛型類或方法允許使用者指定可以和這些類或方法一起工作的物件型別 2、泛型型別必須是引用型別,不能使用int、double等基本型別來替代泛型集合 3、泛型集合類的構造方法和普通類相同,定義一個泛
Java自學筆記(六)
方法 方法的過載:方法名+改動的引數(無論個數還是型別,不關注修飾符) 定義: 修飾符 + 返回值型別 +方法名稱(引數型別 引數名稱){ 執行內容; return 返回值; } public static