深入了解 Jackson 之 JsonParser

JsonParser

JsonParser 類是底層 Json解析器,類似于 Java 使用 stAx 解析 xml,但 JsonParser 僅僅解析 Json。JsonParser實現(xiàn)相較于 ObjectMapper 更底層,因此解析速度更快,但相對復(fù)雜。

創(chuàng)建

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

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

createParser()方法傳入 Reader, InputStream, URL, byte[]char[] 參數(shù)可以實現(xiàn)解析不同來源 json 數(shù)據(jù)。

解析

JsonParser 工作方式是將 json 分解成一系列標記 (token) ,逐個迭代這些標記進行解析。

    public static void main(String[] args) throws IOException {
        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);
        }
    }

輸出結(jié)果如下

jsonToken = START_OBJECT
jsonToken = FIELD_NAME
jsonToken = VALUE_STRING
jsonToken = FIELD_NAME
jsonToken = VALUE_NUMBER_INT
jsonToken = END_OBJECT
jsonToken = null

通過 JsonParsernextToken() 方法獲得 JsonToken,我們可以檢查 JsonToken 實例的類型,JsonToken 類提供了一組常量表示標記類型:

public enum JsonToken {
    NOT_AVAILABLE((String)null, -1),
    START_OBJECT("{", 1),
    END_OBJECT("}", 2),
    START_ARRAY("[", 3),
    END_ARRAY("]", 4),
    FIELD_NAME((String)null, 5),
    VALUE_EMBEDDED_OBJECT((String)null, 12),
    VALUE_STRING((String)null, 6),
    VALUE_NUMBER_INT((String)null, 7),
    VALUE_NUMBER_FLOAT((String)null, 8),
    VALUE_TRUE("true", 9),
    VALUE_FALSE("false", 10),
    VALUE_NULL("null", 11);
    ...  //省略其他
}

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

image.png

示例

public static void main(String[] args) throws IOException {
        String json = "{ \"name\" : \"tom\", \"age\" : 28, \"height\": 1.75, \"ok\": true}";

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

        while (!parser.isClosed()) {
            JsonToken token = parser.nextToken();
            if (JsonToken.FIELD_NAME == token) {
                String fieldName = parser.getCurrentName();
                System.out.print(fieldName + ": ");

                parser.nextToken();
                switch (fieldName) {
                    case "name":
                        System.out.println(parser.getValueAsString());
                        break;
                    case "age":
                        System.out.println(parser.getValueAsInt());
                        break;
                    case "height":
                        System.out.println(parser.getValueAsDouble());
                        break;
                    case "ok":
                        System.out.println(parser.getValueAsBoolean());
                        break;
                }
            }
        }
    }

輸出

name: tom
age: 28
height: 1.75
ok: true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容