Skip to main content
 首页 » 编程设计

介绍Jackson JsonParser解析json

2022年07月19日142zlslch

介绍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方式,其为更底层实现。速度更快、当需要更多代码进行判断标记类型进行解析。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/104862861