您现在的位置是:首页 >技术交流 >Jackson使用详解网站首页技术交流

Jackson使用详解

简介Jackson使用详解

Spring MVC 默认采用Jackson解析Json,尽管还有一些其它同样优秀的json解析工具,例如Fast Json、GSON,但是出于最小依赖的考虑,也许Json解析第一选择就应该是Jackson。

一、简介

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。

Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,当升级到 2.x 版本时,包名变为 com.fasterxml.jackson。

Jackson 的核心模块由三部分组成。

  • jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json;
  • jackson-annotations,注解包,提供标准注解功能;
  • jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

二、依赖

使用Maven构建项目,需要添加依赖:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.6</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.6</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.6</version>
</dependency>

当然了,jackson-databind 依赖 jackson-core 和 jackson-annotations,所以可以只显示地添加jackson-databind依赖,jackson-core 和 jackson-annotations 也随之添加到 Java 项目工程中。

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.6</version>
</dependency>

下面是Jackson的用法。

三、 ObjectMapper

Jackson 最常用的 API 就是基于"对象绑定" 的 ObjectMapper:

  • ObjectMapper可以从字符串,流或文件中解析JSON,并创建表示已解析的JSON的Java对象。 将JSON解析为Java对象也称为从JSON反序列化Java对象。
  • ObjectMapper也可以从Java对象创建JSON。 从Java对象生成JSON也称为将Java对象序列化为JSON。
  • Object映射器可以将JSON解析为自定义的类的对象,也可以解析置JSON树模型的对象。

之所以称为ObjectMapper是因为它将JSON映射到Java对象(反序列化),或者将Java对象映射到JSON(序列化)。

四、JsonParser

Jackson JsonParser类是一个底层一些的JSON解析器。 它类似于XML的Java StAX解析器,差别是JsonParser解析JSON而不解析XML。
Jackson JsonParser的运行层级低于Jackson ObjectMapper。 这使得JsonParser比ObjectMapper更快,但使用起来也比较麻烦。

1、创建一个JsonParser

为了创建Jackson JsonParser,首先需要创建一个JsonFactory。 JsonFactory用于创建JsonParser实例。 JsonFactory类包含几个createParser()方法,每个方法都使用不同的JSON源作为参数。
这是创建一个JsonParser来从字符串中解析JSON的示例:

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

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

2、用JsonParser转化JSON

一旦创建了Jackson JsonParser,就可以使用它来解析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等)。

五、Jackson注解

Jackson JSON工具包包含一组Java注解,可以使用这些注解来设置将JSON读入对象的方式或从对象生成什么JSON的方式。 此Jackson注解教程介绍了如何使用Jackson的注解。
下面是一些常用的注解:

在这里插入图片描述

六、JsonParser的Feature

它是JsonParser的一个内部枚举类,共15个枚举值:

public enum Feature {
	AUTO_CLOSE_SOURCE(true),
	
	ALLOW_COMMENTS(false),
	ALLOW_YAML_COMMENTS(false),
	ALLOW_UNQUOTED_FIELD_NAMES(false),
	ALLOW_SINGLE_QUOTES(false),
	@Deprecated
	ALLOW_UNQUOTED_CONTROL_CHARS(false),
	@Deprecated
	ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),
	@Deprecated
	ALLOW_NUMERIC_LEADING_ZEROS(false),
	@Deprecated
	ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS(false),
	@Deprecated
	ALLOW_NON_NUMERIC_NUMBERS(false),
	@Deprecated
	ALLOW_MISSING_VALUES(false),
	@Deprecated
	ALLOW_TRAILING_COMMA(false),
	
	STRICT_DUPLICATE_DETECTION(false),
	IGNORE_UNDEFINED(false),
	INCLUDE_SOURCE_IN_LOCATION(true);
}

小贴士:枚举值均为bool类型,括号内为默认值

每个枚举值都控制着JsonParser不同的行为。

参考wiki JsonParser的Feature

七、jsonMapper.builder()

jsonMapper.builder() 方法返回一个 JsonMapper.Builder 实例,该实例用于构建 ObjectMapper 对象。我们可以使用 JsonMapper.Builder 配置 ObjectMapper 的行为,例如设置日期格式、忽略 null 值等。一旦配置完毕,我们可以调用 build() 方法创建 ObjectMapper 实例,并将其用于序列化和反序列化操作。

例如,以下代码将 Java 对象转换为 JSON 字符串:

MyObject obj = new MyObject();
ObjectMapper mapper = JsonMapper.builder().build();
String jsonString = mapper.writeValueAsString(obj);

或者,以下代码将 JSON 字符串转换为 Java 对象:

String jsonString = "{"name":"John", "age":30}";
ObjectMapper mapper = JsonMapper.builder().build();
MyObject obj = mapper.readValue(jsonString, MyObject.class);
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。