Jackson JsonParser

时间:2020-01-09 10:36:12  来源:igfitidea点击:

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源中仍然会有更多的令牌。

我们可以使用JsonParsernextToken()获得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等)。