介紹Jackson JsonParser解析json

介紹Jackson JsonParser解析json

前文介紹了通過JsonNode解析json,本文深入底層工具JsonParser的用法。

1. 概述

實際應用中經常需要解析json數據,如查詢NoSql數據庫時響應數據格式通常爲Json格式。JsonNode可以非常方便地實現,JsonParser類是底層JSon解析器,類似於Java使用stAx解析xml,但JsonParser僅僅解析Json。JsonParser實現相較於ObjectMapper更底層,因此解析速度更快,但相對複雜。

2. 創建JsonParser

要創建JsonParser需先創建JsonFactory。JsonFactory用於創建JsonParser實例,其有幾個createParser方法,實現對不同json來源。下面示例創建JsonParser解析Json字符串:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

JsonFactory factory = new JsonFactory();
JsonParser  parser  = factory.createParser(carJson);

我們也可以給createParser() 方法傳入Reader, InputStream, URL, byte 數組 或 char 數組參數實現解析不同來源json數據。

3. JsonParser解析json

創建完JsonParser實例後,可以用其解析json數據。JsonParser工作方式是將JSON分解成一系列標記(token),逐個迭代這些標記進行解析。

下面JsonParser示例通過簡單循環所有標記並打印至控制檯。這個示例沒有實際價值,但展示瞭如何分解json爲標記的過程,同時展示遍歷標記的基本知識:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

JsonFactory factory = new JsonFactory();
JsonParser  parser  = factory.createParser(carJson);

while(!parser.isClosed()){
    JsonToken jsonToken = parser.nextToken();

    System.out.println("jsonToken = " + jsonToken);
}

只要JsonParser的isClosed()方法返回false,則說明源json仍有標記沒有被解析。
通過JsonParser的nextToken()方法獲得JsonToken,我們可以檢查JsonToken實例的類型,JsonToken 類提供了一組常量表示標記類型:

START_OBJECT
END_OBJECT
START_ARRAY
END_ARRAY
FIELD_NAME
VALUE_EMBEDDED_OBJECT
VALUE_FALSE
VALUE_TRUE
VALUE_NULL
VALUE_STRING
VALUE_NUMBER_INT
VALUE_NUMBER_FLOAT

我們可以使用這些常量檢查當前JsonToken 是什麼類型,具體實例:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

JsonFactory factory = new JsonFactory();
JsonParser  parser  = factory.createParser(carJson);

Car car = new Car();
while(!parser.isClosed()){
    JsonToken jsonToken = parser.nextToken();

    if(JsonToken.FIELD_NAME.equals(jsonToken)){
        String fieldName = parser.getCurrentName();
        System.out.println(fieldName);

        jsonToken = parser.nextToken();

        if("brand".equals(fieldName)){
            car.brand = parser.getValueAsString();
        } else if ("doors".equals(fieldName)){
            car.doors = parser.getValueAsInt();
        }
    }
}

System.out.println("car.brand = " + car.brand);
System.out.println("car.doors = " + car.doors);

如果標記指針指向的是字段,JsonParser的getCurrentName()方法返回當前字段名稱。getValueAsString() 返回當前標記值的字符串類型,同理 getValueAsInt()返回整型值,其他方法還有返回boolean, short, long, float, double 等類型。

4. 總結

本文介紹了Jackson JsonParser解析json,不同於JsonNode方式,其爲更底層實現。速度更快、當需要更多代碼進行判斷標記類型進行解析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章