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
通过 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()
返回整型值
其他方法:
示例
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