Jackson - 快速指南



概述

Jackson 是一个基于 Java 的简单库,用于将 Java 对象序列化为 JSON,反之亦然。

特性

  • 易于使用。 - Jackson API 提供了一个高级外观来简化常用的用例。

  • 无需创建映射。 - Jackson API 为大多数要序列化的对象提供了默认映射。

  • 性能。 - Jackson 非常快,内存占用少,适用于大型对象图或系统。

  • 干净的 JSON。 - Jackson 创建干净简洁的 JSON 结果,易于阅读。

  • 无依赖性。 - Jackson 库除了 JDK 外不需要任何其他库。

  • 开源 - Jackson 库是开源的,可以免费使用。

三种处理 JSON 的方法

Jackson 提供三种替代方法来处理 JSON

  • 流式 API - 将 JSON 内容读取和写入为离散事件。JsonParser 读取数据,而 JsonGenerator 写入数据。它是三种方法中最强大的方法,开销最低,读写操作最快。它类似于 XML 的 Stax 解析器。

  • 树模型 - 准备 JSON 文档的内存树表示。ObjectMapper 构建 JsonNode 节点的树。这是最灵活的方法。它类似于 XML 的 DOM 解析器。

  • 数据绑定 - 使用属性访问器或注解将 JSON 转换为 POJO(普通旧 Java 对象),反之亦然。它有两种类型。

    • 简单数据绑定 - 将 JSON 转换为 Java Maps、Lists、Strings、Numbers、Booleans 和 null 对象,反之亦然。

    • 完整数据绑定 - 将 JSON 转换为任何 JAVA 类型,反之亦然。

    ObjectMapper 读取/写入这两种类型的数据绑定的 JSON。数据绑定是最方便的方法,类似于 XML 的 JAXB 解析器。

环境设置

在线尝试选项

您真的不需要设置自己的环境来开始学习 Guava,一个基于 JAVA 的库。原因很简单,我们已经在线设置了 Java 编程环境,以便您可以在进行理论工作的同时,在线编译和执行所有可用的示例。这使您对正在阅读的内容充满信心,并可以使用不同的选项检查结果。随意修改任何示例并在在线执行。

使用以下示例,在下面示例代码框的右上角使用尝试选项。

public class MyFirstJavaProgram {

    public static void main(String []args) {
       System.out.println("Hello World");
    }
} 

对于本教程中给出的大多数示例,您都会找到尝试选项,因此只需使用它并享受您的学习。

本地环境设置

如果您仍然希望为 Java 编程语言设置环境,则本节将指导您如何在机器上下载和设置 Java。请按照以下步骤设置环境。

Java SE 可从以下链接免费获得 下载 Java。因此,您可以根据您的操作系统下载一个版本。

按照说明下载 java 并运行.exe 在您的机器上安装 Java。在您的机器上安装 Java 后,您需要设置环境变量以指向正确的安装目录

为 Windows 2000/XP 设置路径

假设您已将 Java 安装在c:\Program Files\java\jdk目录中

  • 右键单击“我的电脑”,然后选择“属性”。

  • 在“高级”选项卡下单击“环境变量”按钮。

  • 现在,更改“Path”变量,使其还包含 Java 可执行文件的路径。例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,则将您的路径更改为“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。

为 Windows 95/98/ME 设置路径

假设您已将 Java 安装在c:\Program Files\java\jdk目录中

  • 编辑“C:\autoexec.bat”文件,并在末尾添加以下行
    “SET PATH=%PATH%;C:\Program Files\java\jdk\bin”

为 Linux、UNIX、Solaris、FreeBSD 设置路径

环境变量 PATH 应设置为指向已安装 Java 二进制文件的目录。如果您在执行此操作时遇到问题,请参阅您的 shell 文档。

例如,如果您使用bash作为您的 shell,那么您将在“.bashrc”的末尾添加以下行:export PATH=/path/to/java:$PATH'

流行的 Java 编辑器

要编写 Java 程序,您需要一个文本编辑器。市场上甚至还有更复杂的 IDE 可用。但就目前而言,您可以考虑以下之一

  • 记事本:在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(推荐用于本教程)、TextPad。

  • Netbeans:是一个开源且免费的 Java IDE,可以从http://www.netbeans.org/index.html下载。

  • Eclipse:也是一个由 Eclipse 开源社区开发的 Java IDE,可以从http://www.eclipse.org/下载。

下载 Jackson 归档文件

Maven 存储库 - Jackson下载最新版本的 Jackson jar 文件。在本教程中,jackson-core-2.8.9.jar、jackson-annotations-2.8.9.jar 和 jackson-databind-2.8.9.jar 已下载并复制到 C:\> jackson 文件夹中。

操作系统归档文件名
Windowsjackson-xxx-2.8.9.jar
Linuxjackson-xxx-2.8.9.jar
Macjackson-xxx-2.8.9.jar

设置 Jackson 环境

设置jackson_HOME环境变量以指向 Guava jar 存储在您机器上的基本目录位置。假设,我们已将 jackson-core-2.8.9.jar、jackson-annotations-2.8.9.jar 和 jackson-databind-2.8.9.jar 解压到各个操作系统的 jackson 文件夹中,如下所示。

操作系统输出
Windows将环境变量 jackson_HOME 设置为 C:\jackson
Linuxexport jackson_HOME=/usr/local/jackson
Macexport jackson_HOME=/Library/jackson

设置 CLASSPATH 变量

设置CLASSPATH环境变量以指向 jackson jar 的位置。假设,我们已将 jackson-core-2.8.9.jar、jackson-annotations-2.8.9.jar 和 jackson-databind-2.8.9.jar 存储在各个操作系统的 jackson 文件夹中,如下所示。

操作系统输出
Windows将环境变量 CLASSPATH 设置为 %CLASSPATH%;%jackson_HOME%\jackson-core-2.8.9.jar;%jackson_HOME%\jackson-databind-2.8.9.jar;%jackson_HOME%\jackson-annotations-2.8.9.jar;.;
Linuxexport CLASSPATH=$CLASSPATH:$jackson_HOME/jackson-core-2.8.9.jar:$jackson_HOME/jackson-databind-2.8.9.jar:$jackson_HOME/jackson-annotations-2.8.9.jar:.
Macexport CLASSPATH=$CLASSPATH:$jackson_HOME/jackson-core-2.8.9.jar:$jackson_HOME/jackson-databind-2.8.9.jar:$jackson_HOME/jackson-annotations-2.8.9.jar:.

第一个应用

在深入了解 jackson 库的细节之前,让我们看看一个实际应用。在此示例中,我们创建了 Student 类。我们将使用学生详细信息创建一个 JSON 字符串,并将其反序列化为学生对象,然后将其序列化为 JSON 字符串。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
   
      ObjectMapper mapper = new ObjectMapper();
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
      
      //map json to student
      try{
         Student student = mapper.readValue(jsonString, Student.class);
         
         System.out.println(student);
         
         jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(student);
         
         System.out.println(jsonString);
      }
      catch (JsonParseException e) { e.printStackTrace();}
      catch (JsonMappingException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 21 ]
{
  "name" : "Mahesh",
  "age" : 21
}

需要记住的步骤

以下是此处需要考虑的重要步骤。

步骤 1:创建 ObjectMapper 对象。

创建 ObjectMapper 对象。它是一个可重用的对象。

ObjectMapper mapper = new ObjectMapper();

步骤 2:将 JSON 反序列化为对象。

使用 readValue() 方法从 JSON 获取对象。将 json 字符串/json 字符串的源和对象类型作为参数传递。

//Object to JSON Conversion
Student student = mapper.readValue(jsonString, Student.class);

步骤 3:将对象序列化为 JSON。

使用 writeValueAsString() 方法获取对象的 JSON 字符串表示形式。

//Object to JSON Conversion		
jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(student);

ObjectMapper 类

ObjectMapper 是 Jackson 库的主要参与者类。ObjectMapper 类 ObjectMapper 提供了读取和写入 JSON 的功能,可以从基本 POJO(普通旧 Java 对象)或从通用 JSON 树模型 (JsonNode) 读取和写入,以及执行转换的相关功能。它也高度可定制,可以与不同风格的 JSON 内容一起使用,并支持更高级的对象概念,例如多态性和对象标识。ObjectMapper 还可以充当更高级的 ObjectReader 和 ObjectWriter 类的工厂。

类声明

以下是com.fasterxml.jackson.databind.ObjectMapper类的声明:

public class ObjectMapper
   extends ObjectCodec
      implements Versioned, Serializable

嵌套类

序号 类和描述
1 static class ObjectMapper.DefaultTypeResolverBuilder

自定义 TypeResolverBuilder,提供与所谓的“默认类型”(有关详细信息,请参阅 enableDefaultTyping())一起使用的类型解析器构建器。

2 static class ObjectMapper.DefaultTyping

与 enableDefaultTyping() 一起使用的枚举,用于指定应为哪种类型的类型(类)使用默认类型。

字段

  • protected DeserializationConfig _deserializationConfig - 定义序列化过程基本全局设置的配置对象。

  • protected DefaultDeserializationContext _deserializationContext - 蓝图上下文对象;存储在此处以允许自定义子类。

  • protected InjectableValues _injectableValues - 反序列化 POJO 中要注入的值的提供程序。

  • protected JsonFactory _jsonFactory - 用于根据需要创建 JsonParser 和 JsonGenerator 实例的工厂。

  • protected SimpleMixInResolver _mixIns - 定义如何应用 mix-in 注解的映射:键是要接收附加注解的类型,值是要“混合”的注解的类型。

  • protected ConfigOverrides _propertyOverrides - 当前活动的每类型配置覆盖,通过属性的声明类型访问。

  • protected Set<Object> _registeredModuleTypes - 已注册的模块类型集(根据 Module.getTypeId());仅在 MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS 启用时跟踪,以便可以忽略重复的注册调用(以避免多次添加相同的处理程序,主要是)。

  • protected ConcurrentHashMap<JavaType,JsonDeserializer<Object>> _rootDeserializers - 我们将使用单独的主级 Map 来跟踪根级反序列化器。

  • protected SerializationConfig _serializationConfig - 定义序列化过程基本全局设置的配置对象。

  • protected SerializerFactory _serializerFactory - 用于构造序列化器的序列化器工厂。

  • protected DefaultSerializerProvider _serializerProvider - 管理对用于序列化的序列化器访问的对象,包括缓存。

  • protected SubtypeResolver _subtypeResolver - 用于注册子类型、根据需要将它们解析为超类型/子类型的事物。

  • protected TypeFactory _typeFactory - 用于创建 JavaType 实例的特定工厂;需要允许模块添加更多自定义类型处理(主要用于支持非 Java JVM 语言的类型)。

  • protected static AnnotationIntrospector DEFAULT_ANNOTATION_INTROSPECTOR

  • protected static BaseSettings DEFAULT_BASE - 基本设置包含所有 ObjectMapper 实例使用的默认值。

  • protected static VisibilityChecker<?> STD_VISIBILITY_CHECKER

构造函数

序号构造函数和描述
1ObjectMapper()

默认构造函数,它将根据需要构造默认的 JsonFactory,使用 SerializerProvider 作为其 SerializerProvider,以及 BeanSerializerFactory 作为其 SerializerFactory。

2ObjectMapper(JsonFactory jf)

构造使用指定的 JsonFactory 来构造必要的 JsonParsers 和/或 JsonGenerators 的实例。

3ObjectMapper(JsonFactory jf, SerializerProvider sp, DeserializerProvider dp)

构造使用指定的 JsonFactory 来构造必要的 JsonParsers 和/或 JsonGenerators 的实例,并使用给定的提供程序来访问序列化器和反序列化器。

4protected ObjectMapper(ObjectMapper src)

复制构造函数,主要用于支持 copy()。

方法

用于构建用于序列化的 SerializerProvider 的可覆盖辅助方法。 void addMixInAnnotations(Class<?> target, Class<?> mixinSource) - 已弃用。 自 2.5 版起:由该方法的流畅形式替换;addMixIn(Class, Class)。 protected DefaultDeserializationContext createDeserializationContext(JsonParser p, DeserializationConfig cfg) - 内部辅助方法,用于为反序列化单个根值创建 DeserializationContext 实例。 JsonSchema generateJsonSchema(Class<?> t) - 已弃用。 自 2.6 版起,使用外部 JSON Schema 生成器 (https://github.com/FasterXML/jackson-module-jsonSchema)(在后台调用 acceptJsonFormatVisitor(JavaType, JsonFormatVisitorWrapper)) void registerSubtypes(Class<?>... classes) - 用于将指定类注册为子类型的方法,以便基于类型的解析能够将超类型链接到子类型(作为使用注释的替代方法)。 void setFilters(FilterProvider filterProvider) - 已弃用。 自 2.6 版起,请改用 setFilterProvider(com.fasterxml.jackson.databind.ser.FilterProvider)(允许链接)用于构造将使用指定字符转义详细信息进行输出的 ObjectReader 的工厂方法。
1protected void _checkInvalidCopy(Class<?> exp)

2protected void _configAndWriteValue(JsonGenerator g, Object value) - 用于根据需要配置生成器,然后调用写入功能的方法
3protected Object _convert(Object fromValue, JavaType toValueType) - 实际的转换实现:而不是使用现有的读取和写入方法,大部分代码都是内联的。
4protected JsonDeserializer<Object> _findRootDeserializer(DeserializationContext ctxt, JavaType valueType) - 用于查找传递的根级值的反序列化器的方法。
5protected JsonToken _initForReading(JsonParser p) - 用于确保给定的解析器已准备好读取数据绑定的内容的方法。
6protected ObjectReader _newReader(DeserializationConfig config) - 子类必须覆盖的工厂方法,以生成正确子类型的 ObjectReader 实例
7protected ObjectReader _newReader(DeserializationConfig config, JavaType valueType, Object valueToUpdate, FormatSchema schema, InjectableValues injectableValues) - 子类必须覆盖的工厂方法,以生成正确子类型的 ObjectReader 实例
8protected ObjectWriter _newWriter(SerializationConfig config) - 子类必须覆盖的工厂方法,以生成正确子类型的 ObjectWriter 实例
9protected ObjectWriter _newWriter(SerializationConfig config, FormatSchema schema) - 子类必须覆盖的工厂方法,以生成正确子类型的 ObjectWriter 实例
10protected ObjectWriter _newWriter(SerializationConfig config, JavaType rootType, PrettyPrinter pp) - 子类必须覆盖的工厂方法,以生成正确子类型的 ObjectWriter 实例。
11protected Object _readMapAndClose(JsonParser p0, JavaType valueType)
12protected Object _readValue(DeserializationConfig cfg, JsonParser p, JavaType valueType) - 值读取+绑定操作的实际实现。
13protected DefaultSerializerProvider _serializerProvider(SerializationConfig config)
14protected Object _unwrapAndDeserialize(JsonParser p, DeserializationContext ctxt, DeserializationConfig config, JavaType rootType, JsonDeserializer<Object> deser)
15protected void _verifySchemaType(FormatSchema schema)
16void acceptJsonFormatVisitor(Class<?> type, JsonFormatVisitorWrapper visitor) - 用于使用指定的访问者访问给定类型的类型层次结构的方法。
17void acceptJsonFormatVisitor(JavaType type, JsonFormatVisitorWrapper visitor) - 用于使用指定的访问者访问给定类型的类型层次结构的方法。
18ObjectMapper addHandler(DeserializationProblemHandler h) - 用于添加指定的 DeserializationProblemHandler 以用于处理反序列化期间的特定问题的方法。
19ObjectMapper addMixIn(Class<?> target, Class<?> mixinSource) - 用于添加混合注释以用于增强指定类或接口的方法。
20boolean canDeserialize(JavaType type) - 可以调用以检查映射器是否认为可以反序列化给定类型的对象的方法。
21boolean canDeserialize(JavaType type, AtomicReference<Throwable> cause) - 与 canDeserialize(JavaType) 类似的方法,但可以返回尝试构造序列化器时抛出的实际 Throwable:这可能有助于找出实际问题是什么。
22boolean canSerialize(Class<?> type) - 可以调用以检查映射器是否认为可以序列化给定类的实例的方法。
23boolean canSerialize(Class<?> type, AtomicReference<Throwable> cause) - 与 canSerialize(Class) 类似的方法,但可以返回尝试构造序列化器时抛出的实际 Throwable:这可能有助于找出实际问题是什么。
24ObjectMapper clearProblemHandlers() - 用于从此映射器中删除所有已注册的 DeserializationProblemHandlers 实例的方法。
25MutableConfigOverride configOverride(Classlt;?> type) - 用于获取给定类型的可变配置覆盖对象的方法,需要添加或更改应用于给定类型属性的每个类型的覆盖。
26ObjectMapper configure(DeserializationFeature f, boolean state) - 用于更改此对象映射器的打开/关闭反序列化功能状态的方法。
27ObjectMapper configure(JsonGenerator.Feature f, boolean state) - 用于更改此对象映射器创建的生成器实例的打开/关闭 JsonGenerator 功能状态的方法。
28ObjectMapper configure(JsonParser.Feature f, boolean state) - 用于更改此对象映射器创建的解析器实例的指定 JsonParser.Features 状态的方法。
29ObjectMapper configure(MapperFeature f, boolean state) - 用于更改此映射器实例的打开/关闭映射器功能状态的方法。
30ObjectMapper configure(SerializationFeature f, boolean state) - 用于更改此对象映射器的打开/关闭序列化功能状态的方法。
31JavaType constructType(Type t) - 用于根据给定类型(通常是 java.lang.Class)构造 JavaType 的便捷方法,但没有显式上下文。
32<T> T convertValue(Object fromValue, Class<T> toValueType) - 用于从给定值到给定值类型的实例进行两步转换的便捷方法,如果(但仅当!)需要转换时。
33<T> T convertValue(Object fromValue, JavaType toValueType) - 请参阅 convertValue(Object, Class)
34<T> T convertValue(Object fromValue, TypeReference<?> toValueTypeRef) - 请参阅 convertValue(Object, Class)
35ObjectMapper copy() - 用于创建具有与该实例相同的初始配置的新 ObjectMapper 实例的方法。
36ArrayNode createArrayNode() - 注意:返回类型是协变的,因为基本 ObjectCodec 抽象不能引用具体的节点类型(因为它属于核心包,而实现属于映射器包)
37ObjectNode createObjectNode() - 注意:返回类型是协变的,因为基本 ObjectCodec 抽象不能引用具体的节点类型(因为它属于核心包,而实现属于映射器包)
38protected ClassIntrospector defaultClassIntrospector() - 用于构建要使用的默认 ClassIntrospector 的可覆盖辅助方法。
39ObjectMapper disable(DeserializationFeature feature) - 用于启用指定的 DeserializationConfig 功能的方法。
40ObjectMapper disable(DeserializationFeature first, DeserializationFeature... f) - 用于启用指定的 DeserializationConfig 功能的方法。
41ObjectMapper disable(JsonGenerator.Feature... features) - 用于禁用此对象映射器创建的解析器实例的指定 JsonGenerator.Features 的方法。
42ObjectMapper disable(JsonParser.Feature... features) - 用于禁用此对象映射器创建的解析器实例的指定 JsonParser.Features 的方法。
43ObjectMapper disable(MapperFeature... f) - 用于启用指定的 DeserializationConfig 功能的方法。
44ObjectMapper disable(SerializationFeature f) - 用于启用指定的 DeserializationConfig 功能的方法。
45ObjectMapper disable(SerializationFeature first, SerializationFeature... f) - 用于启用指定的 DeserializationConfig 功能的方法。
46ObjectMapper disableDefaultTyping() - 用于禁用自动包含类型信息的方法;如果是这样,只有显式注释的类型(具有 JsonTypeInfo 的类型)将具有其他嵌入的类型信息。
47ObjectMapper enable(DeserializationFeature feature) - 用于启用指定的 DeserializationConfig 功能的方法。
48ObjectMapper enable(DeserializationFeature first, DeserializationFeature... f) - 用于启用指定的 DeserializationConfig 功能的方法。
49ObjectMapper enable(JsonGenerator.Feature... features) - 用于启用此对象映射器创建的解析器实例的指定 JsonGenerator.Features 的方法。
50ObjectMapper enable(JsonParser.Feature... features) - 用于启用此对象映射器创建的解析器实例的指定 JsonParser.Features 的方法。
51ObjectMapper enable(MapperFeature... f) - 用于启用指定的 MapperConfig 功能的方法。
52ObjectMapper enable(SerializationFeature f) - 用于启用指定的 DeserializationConfig 功能的方法。
53ObjectMapper enable(SerializationFeature first, SerializationFeature... f) - 用于启用指定的 DeserializationConfig 功能的方法。
54ObjectMapper enableDefaultTyping() - 等效于调用的便捷方法
55ObjectMapper enableDefaultTyping(ObjectMapper.DefaultTyping dti) - 等效于调用的便捷方法
56ObjectMapper enableDefaultTyping(ObjectMapper.DefaultTyping applicability, JsonTypeInfo.As includeAs) - 用于启用自动包含类型信息的方法,这对于多态类型的正确反序列化是必需的(除非类型已使用 JsonTypeInfo 进行注释)。
57ObjectMapper enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping applicability, String propertyName) - 用于启用自动包含类型信息的方法——对于多态类型的正确反序列化是必需的(除非类型已使用 JsonTypeInfo 进行注释)——使用“As.PROPERTY”包含机制和指定的属性名称用于包含(默认为“@class”,因为默认类型信息始终使用类名作为类型标识符)
58ObjectMapper findAndRegisterModules() - 在功能上等效于以下内容的便捷方法:mapper.registerModules(mapper.findModules());
59Class<?> findMixInClassFor(Class<?> cls)
60static List<Module> findModules() - 用于使用 JDK ServiceLoader 功能以及模块提供的 SPI 定位可用方法的方法。
61static List<Module> findModules(ClassLoader classLoader) - 用于使用 JDK ServiceLoader 功能以及模块提供的 SPI 定位可用方法的方法。
62DateFormat getDateFormat()
63DeserializationConfig getDeserializationConfig() - 返回定义反序列化配置设置的共享默认 DeserializationConfig 对象的方法。
64DeserializationContext getDeserializationContext() - 用于获取当前 DeserializationContext 的方法。
65JsonFactory getFactory() - 可以用来获取此映射器使用的 JsonFactory 的方法,如果它需要构造 JsonParsers 和/或 JsonGenerators。
66InjectableValues getInjectableValues()
67JsonFactory getJsonFactory() - 已弃用。 自 2.1 版起:请改用 getFactory()
68JsonNodeFactory getNodeFactory() - 可以用来获取此映射器在直接为树构造根 JsonNode 实例时将使用的 JsonNodeFactory 的方法。
69PropertyNamingStrategy getPropertyNamingStrategy()
70getSerializationConfig() - 返回用于定义序列化配置设置的共享默认 SerializationConfig 对象的方法。
71getSerializerFactory() - 获取当前 SerializerFactory 的方法。
72getSerializerProvider() - 用于访问“蓝图”(或工厂)实例的访问器,通过调用 DefaultSerializerProvider.createInstance(com.fasterxml.jackson.databind.SerializationConfig, com.fasterxml.jackson.databind.ser.SerializerFactory) 从该实例创建实例。
73getSerializerProviderInstance() - 用于构造和返回可用于访问序列化器的 SerializerProvider 实例的访问器。
74getSubtypeResolver() - 用于访问正在使用的子类型解析器的方法。
75getTypeFactory() - 获取当前已配置的 TypeFactory 实例的访问器。
76getVisibilityChecker<?>() - 用于访问当前已配置的可见性检查器的方法;该对象用于确定给定的属性元素(方法、字段、构造函数)是否可以自动检测。
77isEnabled(DeserializationFeature f) - 用于检查是否启用了给定的特定于反序列化的功能的方法。
78isEnabled(JsonFactory.Feature f) - 等同于以下方法的便捷方法:
79boolean isEnabled(JsonGenerator.Feature f)
80boolean isEnabled(JsonParser.Feature f)
81isEnabled(MapperFeature f) - 用于检查是否启用了给定的 MapperFeature 的方法。
82isEnabled(SerializationFeature f) - 用于检查是否启用了给定的特定于序列化的功能的方法。
83int mixInCount()
84reader() - 用于构造具有默认设置的 ObjectReader 的工厂方法。
85reader(Base64Variant defaultBase64) - 用于构造 ObjectReader 的工厂方法,该 ObjectReader 将对 Base64 编码的二进制数据使用指定的 Base64 编码变体。
86reader(Class<?> type) - 已弃用。自 2.5 版起,请改用 readerFor(Class)。
87reader(ContextAttributes attrs) - 用于构造将使用指定默认属性的 ObjectReader 的工厂方法。
88reader(DeserializationFeature feature) - 用于构造具有指定功能启用的 ObjectReader 的工厂方法(与该映射器实例具有的设置相比)。
89reader(DeserializationFeature first, DeserializationFeature... other) - 用于构造具有指定功能启用的 ObjectReader 的工厂方法(与该映射器实例具有的设置相比)。
90reader(FormatSchema schema) - 用于构造 ObjectReader 的工厂方法,该 ObjectReader 将特定的模式对象传递给用于读取内容的 JsonParser。
91reader(InjectableValues injectableValues) - 用于构造将使用指定的可注入值的 ObjectReader 的工厂方法。
92reader(JavaType type) - 已弃用。自 2.5 版起,请改用 readerFor(JavaType)。
93reader(JsonNodeFactory f) - 用于构造将使用指定的 JsonNodeFactory 构造 JSON 树的 ObjectReader 的工厂方法。
94reader(TypeReference<?> type) - 已弃用。自 2.5 版起,请改用 readerFor(TypeReference)。
95readerFor(Class<?> type) - 用于构造将读取或更新指定类型实例的 ObjectReader 的工厂方法。
96readerFor(JavaType type) - 用于构造将读取或更新指定类型实例的 ObjectReader 的工厂方法。
97readerFor(TypeReference<?> type) - 用于构造将读取或更新指定类型实例的 ObjectReader 的工厂方法。
98readerForUpdating(Object valueToUpdate) - 用于构造将使用 JSON 数据更新给定对象(通常是 Bean,但也可能是集合或映射,但不是数组)的 ObjectReader 的工厂方法。
99readerWithView(Class<?> view) - 用于构造将使用指定的 JSON 视图(过滤器)反序列化对象的 ObjectReader 的工厂方法。
100readTree(byte[] content) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
101readTree(File file) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
102readTree(InputStream in) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
103<T extends TreeNode> T readTree(JsonParser p) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
104readTree(Reader r) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
105readTree(String content) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
106readTree(URL source) - 将 JSON 内容反序列化为使用一组 JsonNode 实例表示的树的方法。
107<T> T readValue(byte[] src, Class<T> valueType)
108<T> T readValue(byte[] src, int offset, int len, Class<T> valueType)
109<T> T readValue(byte[] src, int offset, int len, JavaType valueType)
110<T> T readValue(byte[] src, int offset, int len, TypeReference valueTypeRef)
111<T> T readValue(byte[] src, JavaType valueType)
112<T> T readValue(byte[] src, TypeReference valueTypeRef)
113<T> T readValue(DataInput src, Class<T> valueType)
114<T> T readValue(DataInput src, JavaType valueType)
115<T> T readValue(File src, Class<T> valueType) - 将给定文件中的 JSON 内容反序列化为给定 Java 类型的方法。
116<T> T readValue(File src, JavaType valueType) - 将给定文件中的 JSON 内容反序列化为给定 Java 类型的方法。
117<T> T readValue(File src, TypeReference valueTypeRef) - 将给定文件中的 JSON 内容反序列化为给定 Java 类型的方法。
118<T> T readValue(InputStream src, Class<T> valueType)
119<T> T readValue(InputStream src, JavaType valueType)
120<T> T readValue(InputStream src, TypeReference valueTypeRef)
121<T> T readValue(JsonParser p, Class<T> valueType) - 将 JSON 内容反序列化为非容器类型(但可以是数组类型)的方法:通常是 Bean、数组或包装类型(如 Boolean)。
122<T> T readValue(JsonParser p, JavaType valueType) - 类型安全的重载方法,基本上是 readValue(JsonParser, Class) 的别名。
123<T> T readValue(JsonParser p, ResolvedType valueType) - 将 JSON 内容反序列化为 Java 类型的方法,对该类型的引用作为参数传递。
124<T> T readValue(JsonParser p, TypeReference<?> valueTypeRef) - 将 JSON 内容反序列化为 Java 类型的方法,对该类型的引用作为参数传递。
125<T> T readValue(Reader src, Class<T> valueType) -
1<T> T readValue(Reader src, JavaType valueType)
126<T> T readValue(Reader src, TypeReference valueTypeRef)
127<T> T readValue(String content, Class<T> valueType) - 从给定的 JSON 内容字符串反序列化 JSON 内容的方法。
128<T> T readValue(String content, JavaType valueType) - 从给定的 JSON 内容字符串反序列化 JSON 内容的方法。
129<T> T readValue(String content, TypeReference valueTypeRef) - 从给定的 JSON 内容字符串反序列化 JSON 内容的方法。
130<T> T readValue(URL src, Class<T> valueType) - 将给定资源中的 JSON 内容反序列化为给定 Java 类型的方法。
131<T> T readValue(URL src, JavaType valueType)
132<T> T readValue(URL src, TypeReference valueTypeRef) - 将给定资源中的 JSON 内容反序列化为给定 Java 类型的方法。
133<T> MappingIterator<T> readValues(JsonParser p, Class<T> valueType) - 等同于以下方法的便捷方法:
134<T> MappingIterator<T> readValues(JsonParser p, JavaType valueType) - 等同于以下方法的便捷方法:
135<T> MappingIterator<T> readValues(JsonParser p, ResolvedType valueType) - 等同于以下方法的便捷方法:
136<T> MappingIterator<T> readValues(JsonParser p, TypeReference<?>valueTypeRef) - 用于从解析器流读取对象序列的方法。
137registerModule(Module module) - 用于注册可以扩展此映射器提供的功能的模块的方法;例如,通过添加自定义序列化器和反序列化器的提供程序。
138registerModules(Iterable<Module> modules) - 用于按顺序注册指定模块的便捷方法;在功能上等同于:
139registerModules(Module... modules) - 用于按顺序注册指定模块的便捷方法;在功能上等同于:
140registerSubtypes(NamedType... types) - 用于将指定类注册为子类型的方法,以便基于类型名称的解析可以将超类型链接到子类型(作为使用注释的替代方法)。
141setAnnotationIntrospector(AnnotationIntrospector ai) - 用于设置此映射器实例在序列化和反序列化中使用的 AnnotationIntrospector 的方法。
142setAnnotationIntrospectors(AnnotationIntrospector serializerAI, AnnotationIntrospector deserializerAI) - 用于更改此映射器实例用于序列化和反序列化的 AnnotationIntrospector 实例的方法,分别指定它们以便不同的内省可用于不同的方面。
143setBase64Variant(Base64Variant v) - 用于配置 byte[] 序列化器和反序列化器将使用的默认 Base64Variant 的方法。
144setConfig(DeserializationConfig config) - 允许覆盖底层 DeserializationConfig 对象的方法。
145setConfig(SerializationConfig config) - 允许覆盖底层 SerializationConfig 对象的方法,该对象包含特定于序列化的配置设置。
146setDateFormat(DateFormat dateFormat) - 用于配置在将时间值序列化为字符串和从 JSON 字符串反序列化时使用的默认 DateFormat 的方法。
147setDefaultPrettyPrinter(PrettyPrinter pp) - 用于指定在启用“默认漂亮打印”(通过启用 SerializationFeature.INDENT_OUTPUT)时使用的 PrettyPrinter 的方法。
148setDefaultTyping(TypeResolverBuilder<?> typer) - 用于启用自动包含类型信息的方法,使用指定的处理程序对象来确定这会影响哪些类型,以及如何嵌入信息。
149setFilterProvider(FilterProvider filterProvider) - 用于配置此映射器以使用指定的 FilterProvider 将过滤器 ID 映射到实际过滤器实例的方法。
150setHandlerInstantiator(HandlerInstantiator hi) - 用于配置 HandlerInstantiator 以创建处理程序(如序列化器、反序列化器、类型和类型 ID 解析器)实例的方法,给定一个类。
151setInjectableValues(InjectableValues injectableValues) - 用于配置用于查找要注入的值的 InjectableValues 的方法。
152setLocale(Locale l) - 用于覆盖用于格式化的默认区域设置的方法。
153setMixInAnnotations(Map<Class<?>,Class<?>> sourceMixins) - 已弃用。自 2.5 版起:已替换为该方法的流畅形式;setMixIns(java.util.Map<java.lang.Class<?>, java.lang.Class<?>>)。

154ObjectMapper setMixInResolver(ClassIntrospector.MixInResolver resolver) - 用于指定查找要使用的 mix-in 类解析器的方法,覆盖直接添加的映射。
155ObjectMapper setMixIns(Map<Class<?>,Class<?>> sourceMixins) - 用于定义 mix-in 注解的方法,这些注解用于增强可处理(可序列化/可反序列化)类具有的注解。
156ObjectMapper setNodeFactory(JsonNodeFactory f) - 用于指定 JsonNodeFactory 的方法,该工厂用于构建根级树节点(通过方法 createObjectNode())。
157ObjectMapper setPropertyInclusion(JsonInclude.Value incl) - 用于设置序列化默认 POJO 属性包含策略的方法。
158ObjectMapper setPropertyNamingStrategy(PropertyNamingStrategy s) - 用于设置要使用的自定义属性命名策略的方法。
159ObjectMapper setSerializationInclusion(JsonInclude.Include incl) - 方便方法,等效于调用。
160ObjectMapper setSerializerFactory(SerializerFactory f) - 用于设置用于构建(bean)序列化器的特定 SerializerFactory 的方法。
161ObjectMapper setSerializerProvider(DefaultSerializerProvider p) - 用于设置“蓝图”SerializerProvider 实例的方法,该实例用作实际提供程序实例的基础,用于处理 JsonSerializer 实例的缓存。
162ObjectMapper setSubtypeResolver(SubtypeResolver str) - 用于设置要使用的自定义子类型解析器的方法。
163ObjectMapper setTimeZone(TimeZone tz) - 用于覆盖用于格式化的默认时区的方法。
164ObjectMapper setTypeFactory(TypeFactory f) - 可用于覆盖此映射器使用的 TypeFactory 实例的方法。
165ObjectMapper setVisibility(PropertyAccessor forMethod, JsonAutoDetect.Visibility visibility) - 方便方法,允许更改底层 VisibilityCheckers 的配置,以更改自动检测哪些类型的属性的详细信息。
166ObjectMapper setVisibility(VisibilityChecker<?> vc) - 用于设置当前配置的 VisibilityChecker 的方法,该对象用于确定是否可以自动检测给定的属性元素(方法、字段、构造函数)。
167void setVisibilityChecker(VisibilityChecker<?> vc) - 已弃用。从 2.6 版开始,请改用 setVisibility(VisibilityChecker)。
168JsonParser treeAsTokens(TreeNode n) - 用于根据 JSON 树表示构建 JsonParser 的方法。
169<T> T treeToValue(TreeNode n, Class<T> valueType) - 方便的转换方法,它会将给定 JSON 树包含的数据绑定到特定的值(通常是 bean)类型。
170<T extends JsonNode> T valueToTree(Object fromValue) - treeToValue(com.fasterxml.jackson.core.TreeNode, java.lang.Class<T>) 的反向操作;给定一个值(通常是 bean),将构建等效的 JSON 树表示。
171Version version() - 用于返回存储在包含此类的 jar 中并从中读取的版本信息的方法。
172ObjectWriter writer() - 用于使用默认设置构建 ObjectWriter 的便捷方法。
173ObjectWriter writer(Base64Variant defaultBase64) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将对 Base64 编码的二进制数据使用指定的 Base64 编码变体。
174ObjectWriter writer(CharacterEscapes escapes) -
175ObjectWriter writer(ContextAttributes attrs) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的默认属性。
176ObjectWriter writer(DateFormat df) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的 DateFormat 序列化对象;或者,如果传递 null,则使用时间戳(64 位数字)。
177ObjectWriter writer(FilterProvider filterProvider) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的过滤器提供程序序列化对象。
178ObjectWriter writer(FormatSchema schema) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将特定的 schema 对象传递给用于写入内容的 JsonGenerator。
179ObjectWriter writer(PrettyPrinter pp) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的漂亮打印机进行缩进以序列化对象(或者如果为 null,则不使用漂亮打印机)。
180ObjectWriter writer(SerializationFeature feature) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将启用指定的特性(与此映射器实例具有的设置相比)。
181ObjectWriter writer(SerializationFeature first, SerializationFeature... other) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将启用指定的特性(与此映射器实例具有的设置相比)。
182ObjectWriter writerFor(Class<?> rootType) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的根类型序列化对象,而不是值的实际运行时类型。
183ObjectWriter writerFor(JavaType rootType) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的根类型序列化对象,而不是值的实际运行时类型。
184ObjectWriter writerFor(TypeReference<?> rootType) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的根类型序列化对象,而不是值的实际运行时类型。
185ObjectWriter writerWithDefaultPrettyPrinter() - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用默认漂亮打印机进行缩进以序列化对象。
186ObjectWriter writerWithType(Class<?> rootType) - 已弃用。从 2.5 版开始,请改用 writerFor(Class)。
187ObjectWriter writerWithType(JavaType rootType) - 已弃用。从 2.5 版开始,请改用 writerFor(JavaType)。
188ObjectWriter writerWithType(TypeReference<?> rootType) - 已弃用。从 2.5 版开始,请改用 writerFor(TypeReference)。
189ObjectWriter writerWithView(Class<?> serializationView) - 用于构建 ObjectWriter 的工厂方法,该 ObjectWriter 将使用指定的 JSON 视图(过滤器)序列化对象。
190void writeTree(JsonGenerator jgen, JsonNode rootNode) - 用于使用提供的生成器序列化给定 JSON 树的方法。
191void writeTree(JsonGenerator jgen, TreeNode rootNode)
192void writeValue(DataOutput out, Object value)
193void writeValue(File resultFile, Object value) - 可用于将任何 Java 值序列化为 JSON 输出并写入提供的 File 的方法。
194void writeValue(JsonGenerator g, Object value) - 可用于使用提供的 JsonGenerator 将任何 Java 值序列化为 JSON 输出的方法。
195void writeValue(OutputStream out, Object value) - 可用于使用提供的输出流(使用编码 JsonEncoding.UTF8)将任何 Java 值序列化为 JSON 输出的方法。
196void writeValue(Writer w, Object value) - 可用于使用提供的 Writer 将任何 Java 值序列化为 JSON 输出的方法。
197byte[] writeValueAsBytes(Object value) - 可用于将任何 Java 值序列化为字节数组的方法。
198String writeValueAsString(Object value) - 可用于将任何 Java 值序列化为字符串的方法。

继承的方法

此类继承自以下类的方法

  • java.lang.Object

ObjectMapper 示例

使用您选择的任何编辑器创建以下 Java 程序,例如在 C:/> Jackson_WORKSPACE 中。

文件:JacksonTester.java

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
   
      ObjectMapper mapper = new ObjectMapper();
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";
      
      //map json to student
      try{
         Student student = mapper.readValue(jsonString, Student.class);
         
         System.out.println(student);
         
         jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(student);
         
         System.out.println(jsonString);
      }
      catch (JsonParseException e) { e.printStackTrace();}
      catch (JsonMappingException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 21 ]
{
  "name" : "Mahesh",
  "age" : 21
}

对象序列化

让我们将一个 Java 对象序列化到一个 json 文件中,然后读取该 json 文件以获取该对象。在此示例中,我们创建了 Student 类。我们将创建一个 student.json 文件,其中将包含 Student 对象的 json 表示形式。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         Student student = new Student();
         student.setAge(10);
         student.setName("Mahesh");
         tester.writeJSON(student);

         Student student1 = tester.readJSON();
         System.out.println(student1);

      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private void writeJSON(Student student) throws JsonGenerationException, JsonMappingException, IOException{
      ObjectMapper mapper = new ObjectMapper();	
      mapper.writeValue(new File("student.json"), student);
   }

   private Student readJSON() throws JsonParseException, JsonMappingException, IOException{
      ObjectMapper mapper = new ObjectMapper();
      Student student = mapper.readValue(new File("student.json"), Student.class);
      return student;
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 10 ]

数据绑定

数据绑定 API 用于使用属性访问器或使用注解将 JSON 转换为 POJO(普通旧 Java 对象)以及从 POJO 转换 JSON。它分为两种类型。

  • 简单数据绑定 - 将 JSON 转换为 Java Maps、Lists、Strings、Numbers、Booleans 和 null 对象,反之亦然。

  • 完整数据绑定 - 将 JSON 转换为任何 JAVA 类型,反之亦然。

ObjectMapper 读取/写入这两种类型的数据绑定的 JSON。数据绑定是最方便的方法,类似于 XML 的 JAXB 解析器。

简单数据绑定

简单数据绑定是指将 JSON 映射到 JAVA 核心数据类型。下表说明了 JSON 类型与 Java 类型之间的关系。

序号JSON 类型Java 类型
1对象LinkedHashMap<String,Object>
2数组ArrayList<Object>
3字符串String
4整数Integer、Long 或 BigInteger
5小数Double / BigDecimal
6true | falseBoolean
7nullnull

让我们看看简单数据绑定的实际应用。在这里,我们将 JAVA 基本类型直接映射到 JSON,反之亦然。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
         try {
            ObjectMapper mapper = new ObjectMapper();

            Map<String,Object> studentDataMap = new HashMap<String,Object>(); 
            int[] marks = {1,2,3};

            Student student = new Student();
            student.setAge(10);
            student.setName("Mahesh");
            // JAVA Object
            studentDataMap.put("student", student);
            // JAVA String
            studentDataMap.put("name", "Mahesh Kumar");   		
            // JAVA Boolean
            studentDataMap.put("verified", Boolean.FALSE);
            // Array
            studentDataMap.put("marks", marks);

            mapper.writeValue(new File("student.json"), studentDataMap);
            //result student.json
			//{ 
            //   "student":{"name":"Mahesh","age":10},
            //   "marks":[1,2,3],
            //   "verified":false,
            //   "name":"Mahesh Kumar"
            //}
            studentDataMap = mapper.readValue(new File("student.json"), Map.class);

            System.out.println(studentDataMap.get("student"));
            System.out.println(studentDataMap.get("name"));
            System.out.println(studentDataMap.get("verified"));
            System.out.println(studentDataMap.get("marks"));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

{name=Mahesh, age=10}
Mahesh Kumar
false
[1, 2, 3]

完整数据绑定

完整数据绑定是指将 JSON 映射到任何 JAVA 对象。

//Create an ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();	
//map JSON content to Student object
Student student = mapper.readValue(new File("student.json"), Student.class);
//map Student object to JSON content
mapper.writeValue(new File("student.json"), student);

让我们看看简单数据绑定的实际应用。在这里,我们将 JAVA 对象直接映射到 JSON,反之亦然。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         Student student = new Student();
         student.setAge(10);
         student.setName("Mahesh");
         tester.writeJSON(student);

         Student student1 = tester.readJSON();
         System.out.println(student1);

      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private void writeJSON(Student student) throws JsonGenerationException, JsonMappingException, IOException{
      ObjectMapper mapper = new ObjectMapper();	
      mapper.writeValue(new File("student.json"), student);
   }

   private Student readJSON() throws JsonParseException, JsonMappingException, IOException{
      ObjectMapper mapper = new ObjectMapper();
      Student student = mapper.readValue(new File("student.json"), Student.class);
      return student;
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 10 ]

使用泛型的数据绑定

在简单数据绑定中,我们使用了 Map 类,该类使用 String 作为键,使用 Object 作为值对象。相反,我们可以拥有具体的 Java 对象并将其类型转换以用于 JSON 绑定。

考虑以下使用 UserData 类的示例,UserData 类用于保存用户特定数据。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
         try {
            ObjectMapper mapper = new ObjectMapper();

            Map<String, UserData> userDataMap = new HashMap<String, UserData>();
            UserData studentData = new UserData(); 
            int[] marks = {1,2,3};

            Student student = new Student();
            student.setAge(10);
            student.setName("Mahesh");
            // JAVA Object
            studentData.setStudent(student);
            // JAVA String
            studentData.setName("Mahesh Kumar");
            // JAVA Boolean
            studentData.setVerified(Boolean.FALSE);
            // Array
            studentData.setMarks(marks);
            TypeReference ref = new TypeReference<Map<String,UserData>>() { };
            userDataMap.put("studentData1", studentData);
            mapper.writeValue(new File("student.json"), userDataMap);
            //{
            //   "studentData1":
            //	 {
            //		"student":
            //		{
            //			"name":"Mahesh",
            //			"age":10
            //      },
            //      "name":"Mahesh Kumar",
            //      "verified":false,
            //      "marks":[1,2,3]
            //   }
            //}
            userDataMap = mapper.readValue(new File("student.json"), ref);

            System.out.println(userDataMap.get("studentData1").getStudent());
            System.out.println(userDataMap.get("studentData1").getName());
            System.out.println(userDataMap.get("studentData1").getVerified());
            System.out.println(Arrays.toString(userDataMap.get("studentData1").getMarks()));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

class UserData {
   private Student student;
   private String name;
   private Boolean verified;
   private int[] marks;

   public UserData(){}

   public Student getStudent() {
      return student;
   }
   public void setStudent(Student student) {
      this.student = student;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public Boolean getVerified() {
      return verified;
   }
   public void setVerified(Boolean verified) {
      this.verified = verified;
   }
   public int[] getMarks() {
      return marks;
   }
   public void setMarks(int[] marks) {
      this.marks = marks;
   }		
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 10 ]
Mahesh Kumar
false
[1, 2, 3]

树模型

树模型准备 JSON 文档的内存中树表示。ObjectMapper 构建 JsonNode 节点的树。这是最灵活的方法。它类似于 XML 的 DOM 解析器。

从 JSON 创建树

ObjectMapper 在读取 JSON 后提供指向树的根节点的指针。根节点可用于遍历整棵树。请考虑以下代码片段以获取提供的 JSON 字符串的根节点。

//Create an ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();	
String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
//create tree from JSON
JsonNode rootNode = mapper.readTree(jsonString);

遍历树模型

在遍历树时,使用相对于根节点的相对路径获取每个节点并处理数据。请考虑以下代码片段,该片段在提供根节点的情况下遍历树。

JsonNode nameNode = rootNode.path("name");
System.out.println("Name: "+ nameNode.textValue());
 
JsonNode marksNode = rootNode.path("marks");
Iterator<JsonNode> iterator = marksNode.elements();

示例

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.IOException;
import java.util.Iterator;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){

      try {
         ObjectMapper mapper = new ObjectMapper();
         String jsonString = "{\"name\":\"Mahesh Kumar\",  \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
         JsonNode rootNode = mapper.readTree(jsonString);

         JsonNode nameNode = rootNode.path("name");
         System.out.println("Name: "+ nameNode.textValue());

         JsonNode ageNode = rootNode.path("age");
         System.out.println("Age: " + ageNode.intValue());

         JsonNode verifiedNode = rootNode.path("verified");
         System.out.println("Verified: " + (verifiedNode.booleanValue() ? "Yes":"No"));

         JsonNode marksNode = rootNode.path("marks");
         Iterator<JsonNode> iterator = marksNode.elements();
         System.out.print("Marks: [ ");

         while (iterator.hasNext()) {
            JsonNode marks = iterator.next();
            System.out.print(marks.intValue() + " "); 
         }

         System.out.println("]");
      }
      catch (JsonParseException e) { e.printStackTrace(); }
      catch (JsonMappingException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]

树到 JSON

在此示例中,我们使用 JsonNode 创建了一棵树,并将其写入 json 文件并读回。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.IOException;
import java.util.Iterator;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){

      try {
         ObjectMapper mapper = new ObjectMapper();
         String jsonString = "{\"name\":\"Mahesh Kumar\",  \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
         JsonNode rootNode = mapper.readTree(jsonString);

         JsonNode nameNode = rootNode.path("name");
         System.out.println("Name: "+ nameNode.textValue());

         JsonNode ageNode = rootNode.path("age");
         System.out.println("Age: " + ageNode.intValue());

         JsonNode verifiedNode = rootNode.path("verified");
         System.out.println("Verified: " + (verifiedNode.booleanValue() ? "Yes":"No"));

         JsonNode marksNode = rootNode.path("marks");
         Iterator<JsonNode> iterator = marksNode.elements();
         System.out.print("Marks: [ ");

         while (iterator.hasNext()) {
            JsonNode marks = iterator.next();
            System.out.print(marks.intValue() + " "); 
         }

         System.out.println("]");
      }
      catch (JsonParseException e) { e.printStackTrace(); }
      catch (JsonMappingException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]

树到 Java 对象

在此示例中,我们使用 JsonNode 创建了一棵树,并将其写入 json 文件并读回树,然后将其转换为 Student 对象。

C:\>Jackson_WORKSPACE中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         ObjectMapper mapper = new ObjectMapper();

         JsonNode rootNode = mapper.createObjectNode();
         JsonNode marksNode = mapper.createArrayNode();
         ((ArrayNode)marksNode).add(100);
         ((ArrayNode)marksNode).add(90);
         ((ArrayNode)marksNode).add(85);
         ((ObjectNode) rootNode).put("name", "Mahesh Kumar");
         ((ObjectNode) rootNode).put("age", 21);
         ((ObjectNode) rootNode).put("verified", false);
         ((ObjectNode) rootNode).put("marks",marksNode);

         mapper.writeValue(new File("student.json"), rootNode);

         rootNode = mapper.readTree(new File("student.json"));

         Student student = mapper.treeToValue(rootNode, Student.class);

         System.out.println("Name: "+ student.getName());
         System.out.println("Age: " + student.getAge());
         System.out.println("Verified: " + (student.isVerified() ? "Yes":"No"));
         System.out.println("Marks: "+Arrays.toString(student.getMarks()));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
class Student {
   String name;
   int age;
   boolean verified;
   int[] marks;
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public boolean isVerified() {
      return verified;
   }
   public void setVerified(boolean verified) {
      this.verified = verified;
   }
   public int[] getMarks() {
      return marks;
   }
   public void setMarks(int[] marks) {
      this.marks = marks;
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]

流式 API

流式 API 将 JSON 内容读写为离散事件。JsonParser 读取数据,而 JsonGenerator 写入数据。这三种方法中最强大的一种,开销最低,读写操作速度最快。它类似于 XML 的 Stax 解析器。

在本文中,我们将展示如何使用 Jackson 流式 API 读取和写入 JSON 数据。流式 API 使用标记的概念,并且必须仔细处理 Json 的每个细节。以下是我们将在示例中使用的两个类

使用 JsonGenerator 写入 JSON

使用 JsonGenerator 非常简单。首先使用 JsonFactory.createJsonGenerator() 方法创建 JsonGenerator,然后使用其 write***() 方法写入每个 json 值。

JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File(
   "student.json"), JsonEncoding.UTF8);
// {
jsonGenerator.writeStartObject();
// "name" : "Mahesh Kumar"
jsonGenerator.writeStringField("name", "Mahesh Kumar"); 

让我们看看 JsonGenerator 的实际应用。在 C:\>Jackson_WORKSPACE 中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Map;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){

      try {         
         JsonFactory jsonFactory = new JsonFactory();
         JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("student.json"), JsonEncoding.UTF8);

         jsonGenerator.writeStartObject();

         // "name" : "Mahesh Kumar"
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 

         // "age" : 21
         jsonGenerator.writeNumberField("age", 21);

         // "verified" : false
         jsonGenerator.writeBooleanField("verified", false);

         // "marks" : [100, 90, 85]
         jsonGenerator.writeFieldName("marks"); 

         // [
         jsonGenerator.writeStartArray(); 
         // 100, 90, 85
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         // ]

         jsonGenerator.writeEndArray(); 

         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();        

         //result student.json
         //{ 
         //   "name":"Mahesh Kumar",
         //   "age":21,
         //   "verified":false,
         //   "marks":[100,90,85]
         //}

         ObjectMapper mapper = new ObjectMapper();
         Map<String,Object> dataMap = mapper.readValue(new File("student.json"), Map.class);

         System.out.println(dataMap.get("name"));
         System.out.println(dataMap.get("age"));
         System.out.println(dataMap.get("verified"));
         System.out.println(dataMap.get("marks"));
      } 
      catch (JsonParseException e) { e.printStackTrace(); } 
      catch (JsonMappingException e) { e.printStackTrace(); } 
      catch (IOException e) { e.printStackTrace(); }
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]

使用 JsonParser 读取 JSON

使用 JsonParser 同样非常简单。首先使用 JsonFactory.createJsonParser() 方法创建 JsonParser,然后使用其 nextToken() 方法将每个 json 字符串读取为标记。检查每个标记并相应地进行处理

JsonFactory jasonFactory = new JsonFactory();
JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
   //get the current token
   String fieldname = jsonParser.getCurrentName();
   if ("name".equals(fieldname)) {
      //move to next token
      jsonParser.nextToken();
      System.out.println(jsonParser.getText());        	 
   }
}

让我们看看 JsonParser 的实际应用。在 C:\>Jackson_WORKSPACE 中创建一个名为 JacksonTester 的 Java 类文件。

文件:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Map;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {        	
         JsonFactory jsonFactory = new JsonFactory();

         JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File(
            "student.json"), JsonEncoding.UTF8);
         jsonGenerator.writeStartObject();
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
         jsonGenerator.writeNumberField("age", 21);
         jsonGenerator.writeBooleanField("verified", false); 
         jsonGenerator.writeFieldName("marks"); 
         jsonGenerator.writeStartArray(); // [
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         jsonGenerator.writeEndArray(); 
         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();       	 

         //result student.json
         //{ 
         //   "name":"Mahesh Kumar",
         //   "age":21,
         //   "verified":false,
         //   "marks":[100,90,85]
         //}

         JsonParser jsonParser = jsonFactory.createParser(new File("student.json"));
         while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            //get the current token
            String fieldname = jsonParser.getCurrentName();
            if ("name".equals(fieldname)) {
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getText());        	 
            }
            if("age".equals(fieldname)){
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getNumberValue());        	 
            }
            if("verified".equals(fieldname)){
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getBooleanValue());        	 
            }
            if("marks".equals(fieldname)){
               //move to [ 
               jsonParser.nextToken();
               // loop till token equal to "]"
               while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                  System.out.println(jsonParser.getNumberValue()); 
               }
            }
         }
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

验证结果

使用javac编译器编译类,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 以查看结果

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]

JsonGenerator 类

简介

JsonParser 是定义用于读取 Json 内容的公共 API 的基类。实例是使用 JsonFactory 实例的工厂方法创建的。

类声明

以下是 org.codehaus.jackson.JsonParser 类的声明

public abstract class JsonParser
   extends Object
      implements Closeable, Versioned

嵌套类

序号类和描述
1static class JsonParser.Feature
枚举,定义解析器的所有可切换功能。
2static class JsonParser.NumberType
枚举,表示可用于数字的可能的“原生”(最佳)类型。

字段

  • protected PrettyPrinter _cfgPrettyPrinter - 在输出期间处理漂亮打印(通常是其他空格以使结果更易于人类阅读)的对象。

  • protected JsonToken _currToken - 通过 nextToken() 获取的最后一个标记(如果有)。

  • protected int _features - 由指示哪些 JsonParser.Features 已启用的位组成的位标志。

  • protected JsonToken _lastClearedToken - 最后一个清除的标记(如果有):即,调用 clearCurrentToken() 时有效的标记。

构造函数

序号构造函数和描述
1protected JsonParser()
默认构造函数
2protected JsonParser(int features)

类方法

序号方法和描述
1protected void _reportError(String msg) - 用于使用给定的基本消息构建和抛出 JsonGenerationException 的帮助器方法。
2protected void _reportUnsupportedOperation()
3protected void _throwInternal()

4protected void _writeSimpleObject(Object value)- 用于尝试为给定的无类型对象调用适当的写入方法的辅助方法。
5boolean canOmitFields() - 用于检查是否可以省略写入对象字段的内省方法。
6boolean canUseSchema(FormatSchema schema) - 可用于验证给定模式是否可与此生成器一起使用的方法(使用 setSchema(com.fasterxml.jackson.core.FormatSchema))。
7boolean canWriteBinaryNatively() - 内省方法,可调用以查看底层数据格式是否支持“原生”二进制数据;也就是说,无需编码即可高效输出二进制内容。
8boolean canWriteObjectId() - 内省方法,可调用以查看底层数据格式是否原生支持某种对象 ID(许多格式不支持;例如,JSON 不支持)。
9boolean canWriteTypeId() - 内省方法,可调用以查看底层数据格式是否原生支持某种类型 ID(许多格式不支持;例如,JSON 不支持)。
10abstract void close() - 用于关闭此生成器的方法,以便不再写入任何内容。
11JsonGenerator configure(JsonGenerator.Feature f, boolean state) - 用于启用或禁用指定功能的方法:检查 JsonGenerator.Feature 以获取可用功能列表。
12void copyCurrentEvent(JsonParser jp) - 用于复制给定解析器实例指向的当前事件内容的方法。
13void copyCurrentStructure(JsonParser jp) - 用于复制给定解析器实例指向的当前事件及其包含的后续事件内容的方法。
14abstract JsonGenerator disable(JsonGenerator.Feature f) - 用于禁用指定功能的方法(检查 JsonGenerator.Feature 以获取功能列表)
15abstract JsonGenerator enable(JsonGenerator.Feature f) - 用于启用指定解析器功能的方法:检查 JsonGenerator.Feature 以获取可用功能列表。
16abstract void flush() - 用于将任何缓冲内容刷新到底层目标(输出流、写入器)以及刷新目标本身的方法。
17CharacterEscapes getCharacterEscapes() - 用于访问自定义转义工厂为其创建的 JsonGenerator 使用的方法。
18abstract ObjectCodec getCodec() - 用于访问用于将 Java 对象作为 Json 内容写入的对象的方法(使用 writeObject(java.lang.Object) 方法)。
19abstract int getFeatureMask() - 用于获取所有标准 JsonGenerator.Features 状态的批量访问方法。
20int getHighestEscapedChar() - 用于测试为此生成器配置的最高未转义字符是什么的访问器方法。
21abstract JsonStreamContext getOutputContext()
22Object getOutputTarget()- 可用于访问用作生成输出目标的对象的方法;这通常是 OutputStream 或 Writer,具体取决于生成器是用什么构造的。
23PrettyPrinter getPrettyPrinter()- 用于检查此生成器是否配置了 PrettyPrinter 的访问器;如果已配置,则返回它,如果未配置则返回 null。
24FormatSchema getSchema() - 用于访问此解析器使用的模式(如果有)的方法。
25abstract boolean isClosed() - 可调用以确定此生成器是否已关闭的方法。
26abstract boolean isEnabled(JsonGenerator.Feature f) - 用于检查给定功能是否已启用的方法。
27JsonGenerator setCharacterEscapes(CharacterEscapes esc)- 用于定义自定义转义工厂为其创建的 JsonGenerator 使用的方法。
28abstract JsonGenerator setCodec(ObjectCodec oc)- 可调用以设置或重置用于将 Java 对象作为 JsonContent 写入的对象的方法(使用 writeObject(java.lang.Object) 方法)。
29abstract JsonGenerator setFeatureMask(int mask)- 用于(重新)设置所有标准 JsonGenerator.Features 状态的批量设置方法
30JsonGenerator setHighestNonEscapedChar(int charCode) - 可调用以请求生成器转义所有高于指定代码点的字符代码(如果为正值);或者,除了必须为数据格式转义的字符外,不转义任何字符(如果为 -1)。
31JsonGenerator setPrettyPrinter(PrettyPrinter pp) - 用于设置自定义漂亮打印程序的方法,该程序通常用于添加缩进以提高人类可读性。
32JsonGenerator setRootValueSeparator(SerializableString sep) - 用于覆盖用于分隔根级 JSON 值的字符串的方法(默认为单个空格字符)
33void setSchema(FormatSchema schema) - 用于调用以使此生成器使用指定模式的方法。
33abstract JsonGenerator useDefaultPrettyPrinter()- 用于使用默认漂亮打印程序 (DefaultPrettyPrinter) 启用漂亮打印的便捷方法。
34abstract Version version()- 用于查找提供此生成器实例的捆绑包版本的访问器。
35void writeArrayFieldStart(String fieldName)- 用于输出字段条目(“成员”(将包含 JSON 数组值))和 START_ARRAY 标记的便捷方法。
36abstract void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len)- 用于将给定的二进制数据块作为 base64 编码输出为完整字符串值(用双引号括起来)的方法。
37abstract int writeBinary(Base64Variant b64variant, InputStream data, int dataLength) - 与 writeBinary(Base64Variant,byte[],int,int) 类似的方法,但输入通过流提供,允许增量写入而无需将整个输入保存在内存中。
38void writeBinary(byte[] data)- 类似于 writeBinary(Base64Variant,byte[],int,int),但假设默认使用 Jackson 默认 Base64 变体(即 Base64Variants.MIME_NO_LINEFEEDS)。
39void writeBinary(byte[] data, int offset, int len) - 类似于 writeBinary(Base64Variant,byte[],int,int),但默认使用 Jackson 默认 Base64 变体(即 Base64Variants.MIME_NO_LINEFEEDS)。
40int writeBinary(InputStream data, int dataLength) - 类似于 writeBinary(Base64Variant,InputStream,int),但假设默认使用 Jackson 默认 Base64 变体(即 Base64Variants.MIME_NO_LINEFEEDS)。
41void writeBinaryField(String fieldName, byte[] data) - 用于输出包含指定数据(以 base64 编码形式)的字段条目(“成员”)的便捷方法。
42abstract void writeBoolean(boolean state) - 用于输出文字 Json 布尔值('true' 和 'false' 字符串之一)的方法。
43void writeBooleanField(String fieldName, boolean value) - 用于输出具有布尔值的字段条目(“成员”)的便捷方法。
44abstract void writeEndArray() - 用于写入 JSON 数组值的结束标记(字符 ']';如果启用了漂亮打印,则加上可能的空白装饰)的方法。
45abstract void writeEndObject() - 用于写入 JSON 对象值的结束标记(字符 '}';如果启用了漂亮打印,则加上可能的空白装饰)的方法。
46abstract void writeFieldName(SerializableString name) - 与 writeFieldName(String) 类似的方法,主要区别在于它可能性能更好,因为某些处理(例如某些字符的引用或编码到外部编码(如果生成器支持))可以只执行一次并重复用于后续调用。
47abstract void writeFieldName(String name) - 用于写入字段名称(用双引号括起来的 JSON 字符串:在语法上与 JSON 字符串值相同),如果启用了漂亮打印,则可能由空白装饰。
48abstract void writeNull() - 用于输出文字 Json null 值的方法。
49void writeNullField(String fieldName) - 用于输出具有 JSON 文字值 null 的字段条目(“成员”)的便捷方法。
50abstract void writeNumber(BigDecimal dec) - 用于输出指示 Json 数值的方法。
51abstract void writeNumber(BigInteger v) - 用于将给定值输出为 Json 数字的方法。
52abstract void writeNumber(double d) - 用于输出指示 Json 数值的方法。
53abstract void writeNumber(float f) - 用于输出指示 Json 数值的方法。
54abstract void writeNumber(int v) - 用于将给定值输出为 Json 数字的方法。
55abstract void writeNumber(long v) - 用于将给定值输出为 Json 数字的方法。
56void writeNumber(short v) - 用于将给定值输出为 Json 数字的方法。
57abstract void writeNumber(String encodedValue) - 可用于无法(轻松?)转换为“标准”Java 数字类型的自定义数字类型的方法。
58void writeNumberField(String fieldName, BigDecimal value) - 用于输出具有指定数值的字段条目(“成员”)的便捷方法。
59void writeNumberField(String fieldName, double value) - 用于输出具有指定数值的字段条目(“成员”)的便捷方法。
60void writeNumberField(String fieldName, float value) - 用于输出具有指定数值的字段条目(“成员”)的便捷方法。
61void writeNumberField(String fieldName, int value) - 用于输出具有指定数值的字段条目(“成员”)的便捷方法。
62void writeNumberField(String fieldName, long value) - 用于输出具有指定数值的字段条目(“成员”)的便捷方法。
63abstract void writeObject(Object pojo) - 用于将给定的 Java 对象(POJO)作为 Json 写入的方法。
64void writeObjectField(String fieldName, Object pojo) - 用于输出具有特定 Java 对象的内容作为其值的字段条目(“成员”)的便捷方法。
65void writeObjectFieldStart(String fieldName) - 用于输出字段条目(“成员”(将包含 JSON 对象值))和 START_OBJECT 标记的便捷方法。
66void writeObjectId(Object id) - 可调用以输出所谓的原生对象 ID 的方法。
67void writeObjectRef(Object id) - 可调用以输出对原生对象 ID 的引用的方法。
68void writeOmittedField(String fieldName) 用于指示此位置的属性已跳过的方法。
69abstract void writeRaw(char c) - 用于强制生成器逐字复制输入文本而无需修改的方法(包括不执行转义,即使上下文[数组、对象]否则需要这样做也不添加分隔符)。
70abstract void writeRaw(char[] text, int offset, int len) - 用于强制生成器逐字复制输入文本而无需修改的方法(包括不执行转义,即使上下文[数组、对象]否则需要这样做也不添加分隔符)。
71void writeRaw(SerializableString raw) - 用于强制生成器逐字复制输入文本而无需修改的方法(包括不执行转义,即使上下文[数组、对象]否则需要这样做也不添加分隔符)。
72abstract void writeRaw(String text) - 用于强制生成器逐字复制输入文本而无需修改的方法(包括不执行转义,即使上下文[数组、对象]否则需要这样做也不添加分隔符)。
73abstract void writeRaw(String text, int offset, int len) - 用于强制生成器逐字复制输入文本而无需修改的方法(包括不执行转义,即使上下文[数组、对象]否则需要这样做也不添加分隔符)。
74abstract void writeRawUTF8String(byte[] text, int offset, int length) - 与 writeString(String) 类似的方法,但其输入是 UTF-8 编码的字符串,该字符串将按原样输出,无需额外转义(其类型取决于数据格式;JSON 的反斜杠)。
75abstract void writeRawValue(char[] text, int offset, int len)

76抽象 void writeRawValue(String text) - 强制生成器逐字复制输入文本而不进行任何修改的方法,但假设它必须构成单个合法的 JSON 值(数字、字符串、布尔值、null、数组或列表)。
77抽象 void writeRawValue(String text, int offset, int len)
78抽象 void writeStartArray() - 用于写入 JSON 数组值起始标记的方法(字符 '[';如果启用了漂亮打印,则可能加上空格装饰)。
79抽象 void writeStartObject() - 用于写入 JSON 对象值起始标记的方法(字符 '{';如果启用了漂亮打印,则可能加上空格装饰)。
80抽象 void writeString(char[] text, int offset, int len) - 用于输出字符串值的方法。
81抽象 void writeString(SerializableString text) - 与 writeString(String) 类似的方法,但它接受 SerializableString,这可能使调用更高效,因为生成器可能能够重用带引号和/或编码的表示形式。
82抽象 void writeString(String text) - 用于输出字符串值的方法。
83void writeStringField(String fieldName, String value) - 用于输出具有字符串值的字段条目(“成员”)的便捷方法。
84抽象 void writeTree(TreeNode rootNode) - 使用此生成器写入给定 JSON 树(表示为以给定 JsonNode 为根的树)的方法。
85void writeTypeId(Object id) - 可以调用以输出所谓的原生类型 ID 的方法。
86抽象 void writeUTF8String(byte[] text, int offset, int length) - 与 writeString(String) 类似的方法,但它以 UTF-8 编码的字符串作为输入,该字符串尚未使用数据格式所需的任何转义方案进行转义(对于 JSON,它是控制字符和双引号的反斜杠转义;对于其他格式,则是其他内容)。

继承的方法

此类继承自以下类的方法

  • java.lang.Object

JsonParser 类

简介

JsonParser 是定义用于读取 Json 内容的公共 API 的基类。实例是使用 JsonFactory 实例的工厂方法创建的。

类声明

以下是com.fasterxml.jackson.core.JsonParser类的声明

public abstract class JsonParser
   extends Object
      implements Closeable, Versioned

嵌套类

序号类和描述
1static class JsonParser.Feature
枚举,定义解析器的所有可切换功能。
2static class JsonParser.NumberType
枚举,表示可用于数字的可能的“原生”(最佳)类型。

字段

  • protected int _features - 由指示哪些 JsonParser.Features 已启用的位组成的位标志。

构造函数

序号构造函数和描述
1protected JsonParser()
默认构造函数
2protected JsonParser(int features)

类方法

序号方法和描述
1protected JsonParseException _constructError(String msg) - 基于解析器的当前状态构造 JsonParseExceptions 的辅助方法。
2protected void _reportUnsupportedOperation() - 解析器实现不支持的操作调用的辅助方法。
3boolean canReadObjectId() - 可以调用的内省方法,以查看底层数据格式是否原生支持某种对象 ID(许多都不支持;例如,JSON 不支持)。
4boolean canReadTypeId() - 可以调用的内省方法,以查看底层数据格式是否原生支持某种类型 ID(许多都不支持;例如,JSON 不支持)。
5boolean canUseSchema(FormatSchema schema) - 可用于验证给定模式是否可与此解析器一起使用的方法(使用 setSchema(com.fasterxml.jackson.core.FormatSchema))。
6抽象 void clearCurrentToken() - 用于“使用”当前标记的方法,通过有效地将其移除,以便 hasCurrentToken() 返回 false,而 getCurrentToken() 返回 null。
7抽象 void close() - 关闭解析器,以便无法进行进一步的迭代或数据访问;如果解析器拥有输入源,或者启用了功能 JsonParser.Feature.AUTO_CLOSE_SOURCE,则也会关闭底层输入源。
8JsonParser configure(JsonParser.Feature f, boolean state) - 用于启用或禁用指定功能的方法(检查 JsonParser.Feature 以获取功能列表)
9JsonParser disable(JsonParser.Feature f) - 用于禁用指定功能的方法(检查 JsonParser.Feature 以获取功能列表)
10JsonParser enable(JsonParser.Feature f) - 用于启用指定解析器功能的方法(检查 JsonParser.Feature 以获取功能列表)
11抽象 BigInteger getBigIntegerValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_INT 且由于其大小而无法用作 Java long 原语类型时,可以调用的数字访问器。
12byte[] getBinaryValue() - getBinaryValue(Base64Variant) 的便捷替代方法,默认为使用 Base64Variants.getDefaultVariant() 作为默认编码。
13抽象 byte[] getBinaryValue(Base64Variant b64variant) - 可用于读取(并使用 - 结果在调用后可能无法使用其他方法访问)包含在当前文本 JSON 值中的 base64 编码的二进制数据的方法。
14boolean getBooleanValue() - 当当前标记为 JsonToken.VALUE_TRUE 或 JsonToken.VALUE_FALSE 时可以调用的便捷访问器。
15byte getByteValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_INT 且可以表示为 Java byte 原语类型的值时,可以调用的数字访问器。
16抽象 ObjectCodec getCodec() - 与此解析器关联的对象编解码器的访问器(如果有)。
17抽象 JsonLocation getCurrentLocation() - 返回最后处理的字符位置的方法;通常用于错误报告目的。
18抽象 String getCurrentName() - 可用于获取与当前标记关联的名称的方法:对于 JsonToken.FIELD_NAME,它将与 getText() 返回的内容相同;对于字段值,它将是前面的字段名称;对于其他值(数组值、根级值),则为 null。
19抽象 JsonToken getCurrentToken() - 访问解析器当前指向的标记(如果有)的访问器;如果没有,则返回 null。
20抽象 int getCurrentTokenId() - 与 getCurrentToken() 类似的方法,但返回 int 而不是 JsonToken(枚举值)。
21抽象 BigDecimal getDecimalValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_FLOAT 或 JsonToken.VALUE_NUMBER_INT 时可以调用的数字访问器。
22抽象 double getDoubleValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_FLOAT 且可以表示为 Java double 原语类型时可以调用的数字访问器。
23抽象 Object getEmbeddedObject() - 如果(且仅当)当前标记为 JsonToken.VALUE_EMBEDDED_OBJECT 时可以调用的访问器。
24int getFeatureMask() - 获取所有标准 JsonParser.Features 状态的批量访问方法。
25抽象 float getFloatValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_FLOAT 且可以表示为 Java float 原语类型时可以调用的数字访问器。
26Object getInputSource() - 可用于获取对用于访问正在解析的输入的对象的访问权的方法;这通常是 InputStream 或 Reader,具体取决于解析器是如何构造的。
27抽象 int getIntValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_INT 且可以表示为 Java int 原语类型的值时可以调用的数字访问器。
28抽象 JsonToken getLastClearedToken() - 可用于获取使用 clearCurrentToken() 清除的最后一个标记的方法。
29抽象 long getLongValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_INT 且可以表示为 Java long 原语类型的值时可以调用的数字访问器。
30抽象 JsonParser.NumberType getNumberType() - 如果当前标记的类型为 JsonToken.VALUE_NUMBER_INT 或 JsonToken.VALUE_NUMBER_FLOAT,则返回 JsonParser.NumberType 常量之一;否则返回 null。
31抽象 Number getNumberValue() - 将适用于所有类型数字值的通用数字值访问器方法。
32Object getObjectId() - 可用于检查当前标记(刚刚读取的标记)是否具有关联的对象 ID,以及如果具有,则返回该 ID 的方法。
33抽象 JsonStreamContext getParsingContext() - 可用于访问读取器所在的当前解析上下文的 方法。
34FormatSchema getSchema() - 用于访问此解析器使用的模式(如果有)的方法。
35short getShortValue() - 当当前标记的类型为 JsonToken.VALUE_NUMBER_INT 且可以表示为 Java short 原语类型的值时可以调用的数字访问器。
36抽象 String getText() - 用于访问当前标记的文本表示形式的方法;如果没有当前标记(在第一次调用 nextToken() 之前,或在遇到输入结束之后),则返回 null。
37抽象 char[] getTextCharacters() - 与 getText() 类似的方法,但它将返回包含文本值的底层(不可修改的)字符数组,而不是构造一个 String 对象来包含此信息。
38抽象 int getTextLength() - 与 getTextCharacters() 一起使用的访问器,用于了解存储在返回缓冲区中的字符串的长度。
39抽象 int getTextOffset() - 与 getTextCharacters() 一起使用的访问器,用于了解缓冲区中第一个文本内容字符的偏移量。
40抽象 JsonLocation getTokenLocation() - 返回当前标记的起始位置的方法;也就是说,从输入开始当前标记的第一个字符的位置。
41Object getTypeId() - 可用于检查当前标记(刚刚读取的标记)是否具有关联的类型 ID,以及如果具有,则返回该 ID 的方法。
42boolean getValueAsBoolean() - 将尝试将当前标记的值转换为布尔值的方法。
43boolean getValueAsBoolean(boolean defaultValue) - 将尝试将当前标记的值转换为布尔值的方法。
44double getValueAsDouble() - 将尝试将当前标记的值转换为 Java double 的方法。
45double getValueAsDouble(double defaultValue) - 将尝试将当前标记的值转换为 Java double 的方法。
46int getValueAsInt() - 将尝试将当前标记的值转换为 int 的方法。
47int getValueAsInt(int defaultValue) - 将尝试将当前标记的值转换为 int 的方法。
48long getValueAsLong() - 将尝试将当前标记的值转换为 long 的方法。
49long getValueAsLong(long defaultValue) - 将尝试将当前标记的值转换为 long 的方法。
50String getValueAsString() - 将尝试将当前标记的值转换为字符串的方法。
51抽象 String getValueAsString(String defaultValue) - 将尝试将当前标记的值转换为字符串的方法。
52抽象 boolean hasCurrentToken() - 用于检查解析器当前是否指向标记(以及该标记的数据是否可用)的方法。
53抽象 boolean hasTextCharacters() - 可用于确定调用 getTextCharacters() 是否是访问解析器当前指向的事件的文本内容的最有效方法的方法。
54抽象 boolean isClosed() - 可用于确定此解析器是否已关闭的方法。
55boolean isEnabled(JsonParser.Feature f) - 用于检查是否启用了指定的 JsonParser.Feature 的方法。
56boolean isExpectedStartArrayToken() - 可用于验证当前标记是否指示开始数组(通常表示当前标记为 JsonToken.START_ARRAY)的专用访问器,当预期开始数组时。
57Boolean nextBooleanValue() - 获取下一个标记(就像调用 nextToken() 一样)的方法,如果它是 JsonToken.VALUE_TRUE 或 JsonToken.VALUE_FALSE,则返回匹配的 Boolean 值;否则返回 null。

58boolean nextFieldName(SerializableString str) - 获取下一个标记(如同调用 nextToken())并验证其是否为 JsonToken.FIELD_NAME 且名称与指定名称相同,并返回比较结果。
59int nextIntValue(int defaultValue) - 获取下一个标记(如同调用 nextToken()),如果它是 JsonToken.VALUE_NUMBER_INT 则返回 32 位整数值;否则返回指定的默认值。它在功能上等效于
60long nextLongValue(long defaultValue) - 获取下一个标记(如同调用 nextToken()),如果它是 JsonToken.VALUE_NUMBER_INT 则返回 64 位长整数值;否则返回指定的默认值。它在功能上等效于
61String nextTextValue() - 获取下一个标记(如同调用 nextToken()),如果它是 JsonToken.VALUE_STRING 则返回包含的字符串值;否则返回 null。
62abstract JsonToken nextToken() - 主要迭代方法,它将推进流以确定下一个标记的类型(如果有)。
63abstract JsonToken nextValue() - 迭代方法,它将推进流以确定下一个标记的类型,该标记是值类型(包括 JSON 数组和对象开始/结束标记)。
64abstract void overrideCurrentName(String name) - 可用于更改当前(字段)名称的方法。
65int readBinaryValue(Base64Variant b64variant, OutputStream out) - 类似于 readBinaryValue(OutputStream),但允许显式指定要使用的 Base64 变体。
66int readBinaryValue(OutputStream out) - 可用作 getBigIntegerValue() 的替代方法,尤其是在值可能很大的情况下。
67<T> T readValueAs(Class<T> valueType) - 将 JSON 内容反序列化为非容器类型(它可以是数组类型)的方法:通常是 bean、数组或包装类型(如 Boolean)。
68<T> T readValueAs(TypeReference<?> valueTypeRef)- 将 JSON 内容反序列化为 Java 类型的方法,该类型的引用作为参数传递。
69<T extends TreeNode> T readValueAsTree() - 将 JSON 内容反序列化为等效的“树模型”的方法,由生成的模型的根 TreeNode 表示。
70<T> Iterator<T> readValuesAs(Class<T> valueType) - 用于从解析器流读取对象序列的方法,所有对象都具有相同的指定值类型。
71<T> Iterator<T> readValuesAs(TypeReference<?> valueTypeRef)- 用于从解析器流读取对象序列的方法,所有对象都具有相同的指定值类型。
72int releaseBuffered(OutputStream out) - 可调用以回退任何已读取但未被解析器使用的内容的方法。
73int releaseBuffered(Writer w) - 可调用以回退任何已读取但未被解析器使用的内容的方法。
74boolean requiresCustomCodec() - 可调用以确定是否需要自定义 ObjectCodec 来绑定使用此工厂构建的 JsonParser 解析的数据(这通常也意味着 JsonGenerator 的序列化也是如此)。
75abstract void setCodec(ObjectCodec c) - 设置器,允许定义与此解析器关联的 ObjectCodec(如果有)。
76JsonParser setFeatureMask(int mask) - 所有标准 JsonParser.Features 状态的(重新)设置的批量设置方法
77void setSchema(FormatSchema schema) - 调用以使此解析器使用指定的模式的方法。
78abstract JsonParser skipChildren() - 如果流指向 JsonToken.START_OBJECT 或 JsonToken.START_ARRAY,则此方法将跳过解析器当前指向的数组或对象标记的所有子标记。
79abstract Version version() - 获取核心包版本的访问器,给定一个解析器实例。

继承的方法

此类继承自以下类的方法

  • java.lang.Object

广告