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
通過 JsonParser 的 nextToken() 方法獲得 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