Jackson JsonParser
HymansonJsonParser
类是一个低级JSON解析器。它与XML的Java StAX解析器类似,只是JsonParser
解析JSON而不解析XML。
Hymanson的" JsonParser"的工作级别低于Hymanson的ObjectMapper。这使得" JsonParser"比" ObjectMapper"更快,但是使用起来也比较麻烦。
创建一个JsonParser
为了创建一个HymansonJsonParser
,首先需要创建一个JsonFactory
。 JsonFactory用于创建JsonParser实例。 JsonFactory类包含几个createParser()
方法,每个方法都使用不同的JSON源作为参数。
这是创建一个" JsonParser"来解析字符串中的JSON的示例:
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }"; JsonFactory factory = new JsonFactory(); JsonParser parser = factory.createParser(carJson);
我们还可以将Reader,InputStream,URL,byte数组或者char数组传递给createParser()方法(实际上是其他重载的createParser()版本之一)。
使用JsonParser解析JSON
一旦创建了HymansonJsonParser
,我们就可以使用它来解析JSON。 JsonParser的工作方式是将JSON分解为一系列令牌,我们可以逐个迭代令牌。
这是一个" JsonParser"示例,该示例仅循环遍历所有令牌并将其打印输出到" System.out"。这不是一个非常有用的示例,但是它向我们展示了将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
是什么类型的令牌。我们可以通过这些常量的equals()方法来实现。这是一个例子:
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()返回当前令牌值作为int。 JsonParser具有更多类似的方法来获取不同类型的curren令牌值(例如boolean,short,long,float,double等)。