深入了解 Jackson 之 JsonParser

JsonParser

JsonParser 类是底层 Json解析器,类似于 Java 使用 stAx 解析 xml,但 JsonParser 仅仅解析 Json。JsonParser实现相较于 ObjectMapper 更底层,因此解析速度更快,但相对复杂。

创建

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

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

createParser()方法传入 Reader, InputStream, URL, byte[]char[] 参数可以实现解析不同来源 json 数据。

解析

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);
        }
    }

输出结果如下

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

你可能感兴趣的:(深入了解 Jackson 之 JsonParser)