Java JSON处理:Jackson 1.8.1 + org.json综合教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Jackson 1.8.1是Java领域广泛使用的JSON处理库,提供了高效序列化与反序列化的API。该压缩包包含 jackson-all-1.8.1.jar org.json.jar ,涵盖从基本的JSON操作到复杂的类型绑定等多功能需求。其中 ObjectMapper JsonParser JsonGenerator 是Jackson的核心类,而 org.json 提供了简洁的JSON对象和数组操作接口。组合使用这两个库,开发者能够灵活应对各种JSON数据处理场景,同时要注意避免潜在的命名冲突。 jackson1.8.1 + json.zip

1. Jackson库简介及应用背景

1.1 Java与JSON的邂逅

在现代Web应用程序中,Java作为后端开发的主要语言之一,处理数据交换格式的重要性不言而喻。JSON(JavaScript Object Notation)因其轻量级和易读性,成为了API交互的首选格式。随着业务需求的不断增长,对于JSON数据的处理能力和效率提出了更高的要求。这时,Jackson库应运而生,它不仅仅是一个JSON处理库,更是一个强大的数据处理工具,提供了从数据绑定、序列化到复杂数据结构处理的全面解决方案。

1.2 Jackson库的崛起

Jackson库的崛起,离不开其高性能、易用性以及丰富的特性。自2009年发布以来,Jackson逐渐成为处理JSON数据的行业标准之一。它的设计理念是尽可能地减少用户编写代码的需要,从而提高开发效率。Jackson库的核心组件包括 jackson-databind jackson-core jackson-annotations ,这些组件可以无缝协同工作,帮助开发者在不同的场景下灵活处理JSON数据。

1.3 应用背景与优势

随着微服务架构的普及,前后端分离成为主流开发模式,前端需要从后端获取结构化的数据并进行展示,后端则需要将复杂的数据模型转换成JSON格式。在这样的背景下,Jackson库的应用显得尤为重要。它能够快速将Java对象序列化为JSON字符串,或者反序列化JSON字符串为Java对象,极大地简化了前后端的数据交互过程。不仅如此,Jackson还提供了丰富的配置选项,可以满足个性化的需求,其性能在多数情况下都优于竞争对手,成为许多企业和开发者的首选。

2. jackson-all-1.8.1.jar 核心组件解析

2.1 jackson-databind 组件使用

2.1.1 数据绑定基础

jackson-databind 是Jackson库的核心组件之一,它负责将Java对象与JSON数据之间的转换。在数据绑定的基础操作中,它提供了简单直接的方式来序列化(Java对象转换为JSON字符串)和反序列化(JSON字符串转换为Java对象)数据。

数据绑定流程通常包括以下几个步骤: 1. 创建 ObjectMapper 实例,这是 jackson-databind 库中的一个核心类,负责所有数据转换的主要工作。 2. 使用 ObjectMapper writeValue 方法将Java对象序列化成JSON字符串。 3. 同样地,使用 ObjectMapper readValue 方法来反序列化JSON字符串到Java对象。

例如,以下是一个简单的Java类,以及如何使用 jackson-databind 组件来进行序列化和反序列化的代码示例:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // 创建一个简单的Java对象
        Person person = new Person("John", 30);
        // 序列化Java对象到JSON字符串
        String jsonString = mapper.writeValueAsString(person);
        System.out.println(jsonString);
        // 反序列化JSON字符串到Java对象
        Person personFromJson = mapper.readValue(jsonString, Person.class);
        System.out.println(personFromJson);
    }
    static class Person {
        private String name;
        private int age;
        // 构造函数、getter和setter省略
        // 实现toString方法用于打印对象
        @Override
        public String toString() {
            return "Person(name=" + name + ", age=" + age + ")";
        }
    }
}

2.1.2 高级数据绑定特性

jackson-databind 还提供了一些高级数据绑定特性,比如处理Java泛型、映射JSON数组和对象到Java集合等。

泛型处理: Jackson能够处理Java泛型,并将它们转换成相应的JSON结构。这在处理像Java中的 List<String> Map<String, Object> 这样的数据类型时尤其有用。

例如,下面的代码展示了如何绑定JSON到Java泛型集合:

import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonGenericExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // JSON数组
        String json = "[\"value1\", \"value2\"]";
        // 反序列化为List<String>
        List<String> stringList = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, String.class));
        System.out.println(stringList);
        // JSON对象
        String json2 = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
        // 反序列化为Map<String, String>
        Map<String, String> stringMap = mapper.readValue(json2, mapper.getTypeFactory().constructMapType(Map.class, String.class, String.class));
        System.out.println(stringMap);
    }
}

自定义反序列化: 在某些情况下,可能需要将JSON数据映射到不是标准Java类的结构中。通过实现自定义的反序列化器( JsonDeserializer ),可以定义JSON和Java对象之间的映射逻辑。

import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.io.IOException;

public class CustomPersonDeserializer extends JsonDeserializer<Person> {
    @Override
    public Person deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 根据JSON的具体格式编写反序列化逻辑
        // 返回反序列化后的Person对象
    }
}

@JsonDeserialize(using = CustomPersonDeserializer.class)
public class Person {
    // 类定义省略
}

通过实现自定义反序列化器,可以为JSON数据提供更灵活的处理方式,如忽略某些字段、字段别名处理等。

jackson-databind 组件强大的数据绑定能力,使得在处理Java和JSON之间的数据转换变得简单。而这一切都是建立在上述基本和高级特性之上。

2.2 jackson-core 组件应用

2.2.1 核心处理流程

jackson-core 是Jackson库中负责底层处理的组件。它提供了解析JSON数据的基础工具和API。 jackson-core 的核心处理流程包括对JSON数据的读取、生成和操作。

读取JSON数据:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;

public class JacksonCoreExample {
    public static void main(String[] args) throws Exception {
        JsonFactory jsonFactory = new JsonFactory();
        JsonParser jsonParser = jsonFactory.createParser("{ \"name\": \"John\", \"age\": 30 }");
        while (jsonParser.nextToken() != null) {
            String fieldName = jsonParser.getCurrentName();
            if ("name".equals(fieldName)) {
                jsonParser.nextToken();
                String name = jsonParser.getValueAsString();
                System.out.println("Name: " + name);
            } else if ("age".equals(fieldName)) {
                jsonParser.nextToken();
                int age = jsonParser.getIntValue();
                System.out.println("Age: " + age);
            }
        }
    }
}

2.2.2 与不同格式数据的交互

jackson-core 不仅能够处理JSON格式的数据,还能处理XML、YAML等其他格式的数据。它提供了灵活的API来定义和解析这些格式,这使得它成为一个强大的多格式数据处理库。

处理XML数据:

import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.StringWriter;

public class JacksonXMLExample {
    public static void main(String[] args) throws Exception {
        String xml = "<book><title>Sample Book</title><author>John Doe</author></book>";
        XmlMapper xmlMapper = new XmlMapper(new XmlFactory());
        Book book = xmlMapper.readValue(xml, Book.class);
        System.out.println(book.getTitle());
        System.out.println(book.getAuthor());
    }
    public static class Book {
        private String title;
        private String author;
        // getter和setter省略
    }
}

jackson-core 提供了一个模块化的处理方式,允许开发者根据需要引入特定格式的处理模块,而无需引入整个库。

2.3 jackson-annotations 组件深入

2.3.1 注解类型概览

jackson-annotations 组件提供了用于自定义序列化和反序列化过程的注解。通过这些注解,开发者可以精确控制JSON数据的生成和解析。常见的注解包括 @JsonProperty @JsonFormat @JsonInclude 等。

@JsonProperty 注解: 用于控制JSON字段和Java属性之间的映射关系。

import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {
    @JsonProperty("full_name")
    private String name;
    // getter和setter省略
}

在上面的示例中, full_name 字段将映射到Java对象的 name 属性。

@JsonFormat 注解: 用于定义JSON数据的格式,比如日期时间的表示方式。

import com.fasterxml.jackson.annotation.JsonFormat;

public class Event {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private Date date;
    // getter和setter省略
}

在这个例子中,日期时间格式被明确指定为"dd-MM-yyyy"。

2.3.2 注解在数据处理中的作用

通过在Java类和属性上使用注解,开发者可以控制JSON的生成和解析的细节。例如,可以指定哪些字段需要被序列化,如何处理空值,以及如何处理JSON的嵌套结构等。

忽略空值: 使用 @JsonInclude 注解可以指定哪些属性值为空时会被忽略。

import com.fasterxml.jackson.annotation.JsonInclude;

public class User {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String name;
    // getter和setter省略
}

在这个例子中,如果 name 属性为 null ,那么它就不会出现在序列化的JSON中。

自定义命名策略: @JsonProperty 注解还可以用来定义如何从JSON字段名映射到Java属性名。

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    @JsonProperty(value = "user_name", access = JsonProperty.Access.READ_ONLY)
    private String name;
    // getter和setter省略
}

上面的代码指定JSON字段 user_name 只能在序列化(写入)时使用,而不能在反序列化(读取)时使用。

通过注解,Jackson提供了非常灵活的方式来定义JSON数据处理规则,使得数据绑定过程更加符合实际应用的需求。

总结

jackson-annotations 组件的使用极大地丰富了Jackson数据绑定的灵活性。开发者可以通过各种注解来控制序列化和反序列化的过程,从而满足特定的业务需求。下一节,我们将继续深入学习 jackson-core 组件,并探索如何与其他格式数据进行交互。

3. org.json.jar 库的使用与特性

3.1 org.json 库的基本功能

org.json 是一个轻量级的库,它为处理JSON数据提供了简单的API。它允许开发者轻松地创建、解析、操作JSON数据,并且能够方便地与Java对象进行交互。

3.1.1 JSON数据结构的创建与解析

在Java中,我们可以直接利用 org.json 库中的 JSONObject JSONArray 类来构建JSON对象和数组。下面是一个简单的例子,展示了如何创建一个JSON对象并解析它:

import org.json.JSONObject;
import org.json.JSONArray;
import java.util.Map;
import java.util.HashMap;

public class JsonExample {
    public static void main(String[] args) {
        // 创建一个JSON对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "John");
        jsonObject.put("age", 30);
        // 创建一个JSON数组
        JSONArray jsonArray = new JSONArray();
        jsonArray.put("apple");
        jsonArray.put("banana");
        // 将数组添加到JSON对象中
        jsonObject.put("fruits", jsonArray);
        // 打印JSON对象
        System.out.println(jsonObject.toString());
        // 解析JSON对象
        Map<String, Object> map = jsonObject.toMap();
        System.out.println("Name: " + map.get("name"));
    }
}

在这个例子中,我们首先创建了一个 JSONObject ,并向其中添加了一些键值对。然后,我们创建了一个 JSONArray 并将一些字符串添加到数组中。之后,我们将 JSONArray 作为值添加到 JSONObject 中。最后,我们将 JSONObject 转换为字符串输出,并通过将 JSONObject 转换为Java的 Map 对象来访问它的内容。

3.1.2 简单的JSON数据操作

除了创建和解析JSON数据, org.json 库还提供了简单而直观的方法来操作JSON数据。例如,我们可以轻松地获取和设置JSON对象中的值:

// 继续使用上面的jsonObject实例
String name = jsonObject.getString("name"); // 获取"name"字段的值
int age = jsonObject.getInt("age"); // 获取"age"字段的值
System.out.println("Name: " + name + ", Age: " + age);

// 修改JSON对象中的值
jsonObject.put("name", "Jane");
System.out.println("Updated Name: " + jsonObject.getString("name"));

// 删除JSON对象中的值
jsonObject.remove("age");
System.out.println("Age removed, JSON Object: " + jsonObject.toString());

这个例子演示了如何获取和设置JSON对象中的值。首先,我们使用 getString getInt 方法来获取 name age 字段的值。然后,我们通过 put 方法来更新 name 字段的值,并使用 remove 方法删除 age 字段。

3.2 org.json 库的高级特性

org.json 库不仅提供了基本的JSON处理功能,还包含了一些高级特性,这些特性可以帮助开发者处理更复杂的JSON数据结构。

3.2.1 JSON数组与对象的高级操作

org.json 库允许开发者对JSON数组进行高级操作,比如遍历、查找特定元素等。我们也可以对JSON对象进行深度操作,包括添加、修改、删除嵌套对象。

// 继续使用上面的jsonArray实例
for (int i = 0; i < jsonArray.length(); i++) {
    String fruit = jsonArray.getString(i);
    System.out.println("Fruit: " + fruit);
}

// 向JSON数组中添加元素
jsonArray.put("orange");
System.out.println("Updated JSON Array: " + jsonArray.toString());

// 查找JSON数组中的元素
int index = jsonArray.indexOf("apple");
if (index != -1) {
    System.out.println("Found apple at index: " + index);
}

在这个例子中,我们遍历了 jsonArray 中的所有元素并打印出来。然后我们向数组中添加了一个新元素,并展示了如何查找数组中是否存在特定的元素。

3.2.2 与Java对象的交互技术

在处理JSON数据时,将JSON转换为Java对象或反过来进行转换是一项常见的需求。 org.json 库提供了工具方法,允许开发者在Java对象和JSON数据结构之间进行转换。

import org.json.JSONArray;
import java.util.ArrayList;

public class JavaObjectExample {
    public static class Person {
        private String name;
        private int age;
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        // Getters and setters...
    }
    public static void main(String[] args) {
        ArrayList<Person> people = new ArrayList<>();
        people.add(new Person("John", 30));
        people.add(new Person("Jane", 25));
        // 将Java对象列表转换为JSON数组
        JSONArray jsonArray = new JSONArray();
        for (Person person : people) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name", person.getName());
            jsonObject.put("age", person.getAge());
            jsonArray.put(jsonObject);
        }
        System.out.println("JSON Array: " + jsonArray.toString());
    }
}

在这个例子中,我们定义了一个简单的 Person 类,包含 name age 属性。然后我们创建了一个 Person 对象的列表,并使用 org.json 库将每个 Person 对象转换为 JSONObject ,然后将这些 JSONObject 添加到 JSONArray 中。

org.json 库的高级特性使得处理JSON数据变得更加灵活和强大。无论是操作简单的JSON结构还是在复杂的对象之间进行转换,该库都提供了丰富的API来简化这些任务。

通过深入理解 org.json 库,开发者可以有效地在Java应用程序中处理JSON数据,从而提高开发效率和应用程序的性能。

4. ObjectMapper 类全面应用

ObjectMapper 是Jackson库中最为核心和功能丰富的类,它提供了一系列的工具来将Java对象序列化成JSON格式,同时也可以将JSON数据反序列化为Java对象。本章将详细介绍 ObjectMapper 在数据序列化和反序列化中的应用,并讨论如何处理异常以及自定义序列化策略。

4.1 ObjectMapper 的数据序列化

数据序列化是将对象转换为可存储或可传输的格式的过程。对于 ObjectMapper 来说,这个过程相对简单,因为它隐藏了序列化过程的复杂性,用户只需调用相关方法即可轻松实现。

4.1.1 Java对象转换为JSON字符串

在将Java对象序列化为JSON字符串时, ObjectMapper 提供了 writeValue() 方法,这个方法可以将任何Java对象转换为JSON格式的字符串。下面是一个基本的示例:

ObjectMapper mapper = new ObjectMapper();
Person person = new Person("John Doe", 30);
String jsonString = mapper.writeValueAsString(person);
System.out.println(jsonString);

上面的代码段创建了一个 Person 对象,并通过 ObjectMapper writeValueAsString() 方法将其序列化为JSON字符串。这段代码的输出会是:

{"name":"John Doe","age":30}

4.1.2 自定义序列化策略

虽然 ObjectMapper 提供了基本的序列化功能,但在某些特定场景中,我们可能需要根据需求调整序列化的行为。例如,我们可能想要忽略某个字段,或者改变字段的名称。为此,我们可以利用Jackson注解来自定义序列化策略。下面是一个自定义序列化的例子:

public class CustomPerson {
    @JsonProperty("full_name")
    public String name;
    @JsonIgnore
    public int age;
    // 一个简单的构造函数
    public CustomPerson(@JsonProperty("full_name") String name) {
        this.name = name;
    }
}

// 在序列化时使用自定义的类
ObjectMapper mapper = new ObjectMapper();
CustomPerson customPerson = new CustomPerson("Jane Doe");
String jsonString = mapper.writeValueAsString(customPerson);
System.out.println(jsonString);

在这个例子中,我们创建了一个新的 CustomPerson 类,并使用 @JsonProperty 注解来重命名 name 字段。我们还使用了 @JsonIgnore 注解来忽略 age 字段。输出结果将是:

{"full_name":"Jane Doe"}

请注意,虽然我们定义了 age 字段,但在输出的JSON字符串中并没有包含这个字段,因为 @JsonIgnore 注解的作用就是忽略该字段的序列化。

表格:常见Jackson序列化注解

| 注解名称 | 功能描述 | | ------------- | -------------------------------- | | @JsonProperty | 指定JSON属性名与字段的映射关系。 | | @JsonIgnore | 忽略字段的序列化。 | | @JsonInclude | 控制序列化时字段的包含情况。 | | @JsonFormat | 指定日期等格式化序列化的格式。 | | @JsonSerialize | 自定义序列化逻辑。 | | @JsonDeserialize | 自定义反序列化逻辑。 |

序列化流程图

flowchart LR
    A[Java对象] -->|序列化| B(ObjectMapper)
    B -->|writeValue| C[JSON字符串]

在上图中,我们可以清晰地看到一个对象从Java对象到JSON字符串的序列化过程。

通过本章节的介绍,读者应该已经对 ObjectMapper 在数据序列化中的基本用法和自定义序列化策略有了深入的理解。接下来将探索如何使用 ObjectMapper 来进行数据反序列化,即将JSON字符串转换回Java对象。

5. JsonParser 类深入理解与实践

在处理JSON数据时, JsonParser 类是Jackson库提供的一个强大的解析器,它能够高效地解析JSON数据流。本章节将深入探讨 JsonParser 的基本使用方法和高级应用技巧,包括解析JSON数据的步骤、处理不同类型的JSON节点、流式处理与大数据量JSON、以及性能优化与内存管理。

5.1 JsonParser 的基本使用方法

JsonParser 类用于从输入源(如字符串、文件、网络流等)中解析JSON数据。了解如何使用 JsonParser 来解析数据,是实现高效JSON处理的第一步。

5.1.1 解析JSON数据的步骤

解析JSON数据通常包括以下几个步骤:

  1. 创建一个 JsonParser 实例。这通常通过 ObjectMapper createParser 方法完成。
  2. 读取输入源。 JsonParser 需要一个输入源来从中读取数据,这可能是 InputStream Reader String 类型。
  3. 遍历JSON树。通过调用 JsonParser 的方法来逐个处理JSON节点,包括对象、数组、字段、值等。
  4. 关闭解析器。在处理完数据后,应关闭 JsonParser 以释放相关资源。

5.1.2 处理不同类型的JSON节点

JsonParser 能够处理各种类型的JSON节点。通过使用 JsonToken 枚举,可以检测当前解析到的节点类型,并据此进行不同的处理:

// 示例:解析JSON并输出结构
ObjectMapper mapper = new ObjectMapper();
JsonParser parser = mapper.createParser(new StringReader("{\"name\":\"John\", \"age\":30, \"cars\":[\"Ford\",\"BMW\",\"Fiat\"]}"));

while (parser.nextToken() != null) {
    String fieldName = parser.getCurrentName();
    if ("name".equals(fieldName)) {
        parser.nextToken(); // move to name value
        String name = parser.getText();
        System.out.println("Name: " + name);
    } else if ("age".equals(fieldName)) {
        parser.nextToken(); // move to age value
        int age = parser.getIntValue();
        System.out.println("Age: " + age);
    } else if ("cars".equals(fieldName)) {
        System.out.println("Cars: ");
        parser.nextToken(); // move to array value
        while (parser.nextToken() != JsonToken.END_ARRAY) {
            String car = parser.getText();
            System.out.println(" " + car);
        }
    }
}
parser.close();

上述代码片段展示了如何使用 JsonParser 来解析一个包含 name age cars 字段的JSON对象。通过判断当前的 JsonToken 来决定如何处理不同类型的节点。

5.2 JsonParser 的高级应用技巧

在处理大型JSON数据时,性能和内存消耗是需要关注的两个重要因素。 JsonParser 提供了流式处理的能力和多种性能优化选项,以满足高性能应用的需求。

5.2.1 流式处理与大数据量JSON

流式处理意味着可以边读边处理数据,无需一次性加载整个数据结构。这对于处理大型或无限的JSON数据流特别有用,可以显著减少内存消耗。

使用 JsonParser 的流式处理功能,可以通过配置 JsonParser 的特性来控制解析行为。例如,可以通过设置特性来忽略未知属性、自动处理填充字符等。

5.2.2 性能优化与内存管理

为了进一步优化性能和内存使用,可以采取以下措施:

  • 使用更高效的JSON解析库,如 woodstox ,作为 JsonParser 的底层实现。
  • 对于大数据量的JSON,可以考虑使用 JsonNode 的流式读写特性。
  • 对于频繁解析的简单JSON结构,可以使用 JsonParser JsonGenerator 进行手动解析和序列化,以避免对象创建的开销。
  • 对于自定义数据类型处理,应实现高效的 JsonDeserializer JsonSerializer

下面的表格总结了 JsonParser 的几个关键性能优化技巧:

| 性能优化技巧 | 描述 | | --- | --- | | 使用 woodstox 解析器 | 提供更高的性能和更低的内存占用 | | 自定义解析逻辑 | 减少自动反序列化的开销 | | 避免使用大数据结构 | 减少内存占用和GC压力 | | 使用流式API | 处理大型数据或无限数据流时更有效 |

代码示例展示了如何使用 JsonParser woodstox 结合以提升性能:

ObjectMapper mapper = new ObjectMapper();
// 创建并配置JsonFactory以使用woodstox
JsonFactory jsonFactory = new JsonFactory(new WstxInputFactory());
jsonFactory.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS, true);
JsonParser parser = jsonFactory.createParser(new StringReader(jsonString));

// 使用parser进行数据解析...
parser.close();

在以上示例中,我们配置了 JsonFactory 以使用 woodstox 作为底层解析器,并允许解析未转义的控制字符。这样可以优化解析速度,并在处理某些特殊JSON数据时更为灵活。

通过本章节的介绍,您已经对 JsonParser 的使用方法和高级技巧有了深入的理解。 JsonParser 是处理JSON数据的强大工具,它的灵活应用可以大幅提高程序的性能和资源使用效率。在实际开发中,合理运用 JsonParser ,结合其他库和工具,将能够构建出健壮且高效的JSON处理流程。

6. JsonGenerator 类的灵活运用

JsonGenerator 是Jackson库中负责生成JSON数据的核心类,它提供了丰富的API来构建JSON结构。本章节将深入讲解如何使用 JsonGenerator 类生成JSON数据,以及如何进行高级定制。

6.1 JsonGenerator 生成JSON数据

6.1.1 创建JSON对象与数组

在Jackson中, JsonGenerator 可以用来创建基础的JSON结构,如对象和数组。使用 JsonGenerator 创建JSON结构的基本步骤如下:

  1. 获取 JsonGenerator 实例。
  2. 使用 writeStartObject writeEndObject 来创建一个JSON对象。
  3. 使用 writeStartArray writeEndArray 来创建一个JSON数组。
  4. 使用 writeFieldName writeValue 方法来填充数据。
  5. 调用 close 方法关闭 JsonGenerator

下面是一个简单的示例代码,展示如何使用 JsonGenerator 创建一个包含用户信息的JSON对象和一个包含数字的JSON数组:

import com.fasterxml.jackson.core.JsonGenerator;

import java.io.StringWriter;

public class JsonGeneratorExample {
    public static void main(String[] args) {
        try {
            StringWriter writer = new StringWriter();
            JsonGenerator generator = OBJECT_MAPPER.getFactory().createGenerator(writer);

            generator.writeStartObject(); // 开始写入JSON对象
            generator.writeFieldName("user");
            generator.writeStartObject(); // 开始写入内嵌的JSON对象
            generator.writeStringField("name", "John Doe");
            generator.writeNumberField("age", 30);
            generator.writeEndObject(); // 结束内嵌的JSON对象

            generator.writeFieldName("ids");
            generator.writeStartArray(); // 开始写入JSON数组
            generator.writeNumber(1);
            generator.writeNumber(2);
            generator.writeNumber(3);
            generator.writeEndArray(); // 结束JSON数组
            generator.writeEndObject(); // 结束写入JSON对象

            generator.close();
            System.out.println(writer.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6.1.2 高效写入JSON字段与值

在处理大量数据时,高效的写入操作变得尤为重要。 JsonGenerator 提供了多种方法来写入不同类型的数据,包括字符串、数字、布尔值、null等。它还支持写入二进制数据和基于流的写入,这对于大数据场景非常有用。

下面的示例展示了如何使用 JsonGenerator 高效写入大量数据:

import com.fasterxml.jackson.core.JsonGenerator;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class JsonGeneratorPerformance {
    public static void main(String[] args) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        JsonGenerator generator = OBJECT_MAPPER.getFactory().createGenerator(stream);
        try {
            generator.writeStartObject();
            for (int i = 0; i < 1000000; i++) {
                generator.writeFieldName("value" + i);
                generator.writeNumber(i);
            }
            generator.writeEndObject();
            generator.close();
            byte[]所产生的JSON数据 = stream.toByteArray();
            // 输出JSON数据的长度作为性能指标
            System.out.println("Generated JSON size: " +所产生的JSON数据.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们创建了一个包含一百万个键值对的JSON对象,并通过 ByteArrayOutputStream 捕获生成的JSON数据。这可以用来测试 JsonGenerator 在实际应用中的性能表现。

6.2 JsonGenerator 的高级定制

6.2.1 定制化输出格式与选项

JsonGenerator 提供了多种选项来自定义输出格式,例如:

  • 缩进 ( JsonGenerator.setPrettyPrinter ) 以美化输出,便于阅读。
  • 强制输出空字段 ( JsonGenerator.setSerializationInclusion )。
  • 自定义日期格式 ( ObjectMapper.setDateFormat )。

下面的示例展示了如何设置 JsonGenerator 以美化输出格式:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.core.io.SegmentedStringWriter;

public class JsonGeneratorPrettyPrint {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        // 设置美化输出格式
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

        try {
            String所产生的JSON数据 = objectMapper.writeValueAsString(数据);
            System.out.println(所产生的JSON数据);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

6.2.2 生成复杂JSON结构的策略

在生成复杂的JSON结构时,可能需要预先定义一些策略,比如递归处理嵌套对象或数组、利用自定义序列化器来定制特定类型的输出。策略的选择取决于具体的应用场景和性能要求。

下面是一个如何利用自定义序列化器来处理复杂JSON结构的示例:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;
import java.util.Date;

public class CustomJsonSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value == null) {
            gen.writeNull();
        } else {
            // 自定义日期的格式化
            gen.writeString(value.toString());
        }
    }
}

public class ComplexJsonExample {
    @JsonSerialize(using = CustomJsonSerializer.class)
    private Date myDate;

    // getter和setter方法...
}

// 使用示例代码
// ObjectMapper objectMapper = new ObjectMapper();
// String所产生的JSON数据 = objectMapper.writeValueAsString(ComplexJsonExample实例);

在上述示例中, CustomJsonSerializer 类继承自 JsonSerializer ,通过重写 serialize 方法,我们可以自定义 Date 类型数据的输出格式。然后,我们使用 @JsonSerialize 注解在 ComplexJsonExample 类上应用这个自定义序列化器。

通过这些示例,我们可以看出 JsonGenerator 在生成JSON数据时的灵活性和强大功能。它不仅支持基本的JSON结构创建,还允许开发者通过定制化选项和策略来处理复杂的场景。正确地使用 JsonGenerator 能够显著提高开发效率,并优化最终应用的性能表现。

7. JSONObject JSONArray 类的高级特性

随着JSON数据处理的需求变得更加复杂,对 JSONObject JSONArray 的操作技巧和高级应用提出了更高的要求。本章我们将深入探讨这两个类的高级特性,以及它们在日常开发中的应用。

7.1 JSONObject 的操作技巧

7.1.1 JSON对象的创建与修改

JSONObject 是构建和操作JSON对象的重要工具,它提供了丰富的API来处理键值对。一个 JSONObject 可以通过多种方式来创建:

// 通过Map创建JSONObject
Map<String, Object> map = new HashMap<>();
map.put("name", "John");
map.put("age", 30);
JSONObject jsonObject = new JSONObject(map);

// 通过JSON字符串创建JSONObject
String jsonString = "{\"name\":\"John\", \"age\":30}";
JSONObject jsonObject = new JSONObject(jsonString);

创建JSON对象后,可以使用 put 方法添加新的键值对,或者使用 remove 方法删除已存在的键值对:

// 添加或修改键值对
jsonObject.put("city", "New York");
jsonObject.put("age", 31); // 此处将覆盖已有的age值

// 删除键值对
jsonObject.remove("city");

7.1.2 JSON对象与Java Map的互转

在某些场景下,我们可能需要在Java的 Map 对象和 JSONObject 之间进行转换。 org.json 库提供了直接的支持:

// JSONObject转Map
Map<String, Object> map = jsonObject.toMap();

// Map转JSONObject
JSONObject newJsonObject = new JSONObject(map);

这样的互转操作使得 JSONObject 可以无缝集成到现有的Java代码中,无论是从数据库读取数据后转换为JSON对象,还是将接收到的JSON数据解析为Map进行处理。

7.2 JSONArray 的高级应用

7.2.1 JSON数组的构建与遍历

JSONArray 用于处理JSON数组,提供了添加、删除、检索和遍历元素的方法。构建一个 JSONArray 可以通过数组或者集合作为参数:

// 通过数组创建JSONArray
Object[] array = {"Apple", "Banana", "Cherry"};
JSONArray jsonArray = new JSONArray(array);

// 通过集合创建JSONArray
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
JSONArray jsonArray = new JSONArray(list);

遍历 JSONArray 可以使用传统的for循环,也可以使用迭代器:

// 使用for循环遍历
for (int i = 0; i < jsonArray.length(); i++) {
    System.out.println(jsonArray.get(i));
}

// 使用迭代器遍历
Iterator<Object> iterator = jsonArray.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

7.2.2 JSON数组与Java List的交互

JSONObject 类似, JSONArray 也可以与Java的 List 进行转换,这使得在数据处理时,可以轻松地从Java对象转换到JSON格式:

// Java List转JSONArray
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
JSONArray jsonArray = new JSONArray(list);

// JSONArray转Java List
List<String> newList = jsonArray.toList();

对于更复杂的数据结构,比如包含多个JSON对象的列表,转换过程也同样简单:

List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> item1 = new HashMap<>();
item1.put("name", "Alice");
item1.put("age", 25);
list.add(item1);

List<Map<String, Object>> newList = new ArrayList<>();
for (Object object : jsonArray) {
    newList.add(((JSONObject) object).toMap());
}

通过本章的介绍,我们了解到 JSONObject JSONArray 提供的丰富方法和灵活的操作技巧,使得处理JSON数据变得更加高效和直观。无论是在数据存储、网络传输还是用户界面显示等方面,这些类都是处理JSON不可或缺的工具。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Jackson 1.8.1是Java领域广泛使用的JSON处理库,提供了高效序列化与反序列化的API。该压缩包包含 jackson-all-1.8.1.jar org.json.jar ,涵盖从基本的JSON操作到复杂的类型绑定等多功能需求。其中 ObjectMapper JsonParser JsonGenerator 是Jackson的核心类,而 org.json 提供了简洁的JSON对象和数组操作接口。组合使用这两个库,开发者能够灵活应对各种JSON数据处理场景,同时要注意避免潜在的命名冲突。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

C:\Users\Administrator\.jdks\ms-17.0.15\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:C:\Users\Administrator\AppData\Local\Programs\IntelliJ IDEA Ultimate 2025.1.3\lib\idea_rt.jar=59531" -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\Desktop\考题示例\考题示例\demo\target\classes;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-web\3.1.5\spring-boot-starter-web-3.1.5.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter\3.1.5\spring-boot-starter-3.1.5.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot\3.1.5\spring-boot-3.1.5.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-core\6.0.13\spring-core-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-jcl\6.0.13\spring-jcl-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\yaml\snakeyaml\1.33\snakeyaml-1.33.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-json\3.1.5\spring-boot-starter-json-3.1.5.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.15.3\jackson-datatype-jdk8-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.15.3\jackson-datatype-jsr310-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.15.3\jackson-module-parameter-names-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-tomcat\3.1.5\spring-boot-starter-tomcat-3.1.5.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.15\tomcat-embed-core-10.1.15.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.15\tomcat-embed-el-10.1.15.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.15\tomcat-embed-websocket-10.1.15.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-web\6.0.13\spring-web-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-beans\6.0.13\spring-beans-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\io\micrometer\micrometer-observation\1.10.12\micrometer-observation-1.10.12.jar;D:\apache-maven-3.9.10\maven-repository\io\micrometer\micrometer-commons\1.10.12\micrometer-commons-1.10.12.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-webmvc\6.0.13\spring-webmvc-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-aop\6.0.13\spring-aop-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-context\6.0.13\spring-context-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-expression\6.0.13\spring-expression-6.0.13.jar;D:\apache-maven-3.9.10\maven-repository\com\alibaba\druid-spring-boot-starter\1.2.18\druid-spring-boot-starter-1.2.18.jar;D:\apache-maven-3.9.10\maven-repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-autoconfigure\1.5.22.RELEASE\spring-boot-autoconfigure-1.5.22.RELEASE.jar;D:\apache-maven-3.9.10\maven-repository\org\glassfish\jaxb\jaxb-runtime\2.3.2\jaxb-runtime-2.3.2.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.2\jakarta.xml.bind-api-2.3.2.jar;D:\apache-maven-3.9.10\maven-repository\org\glassfish\jaxb\txw2\2.3.2\txw2-2.3.2.jar;D:\apache-maven-3.9.10\maven-repository\com\sun\istack\istack-commons-runtime\3.0.8\istack-commons-runtime-3.0.8.jar;D:\apache-maven-3.9.10\maven-repository\org\jvnet\staxex\stax-ex\1.8.1\stax-ex-1.8.1.jar;D:\apache-maven-3.9.10\maven-repository\com\sun\xml\fastinfoset\FastInfoset\1.2.16\FastInfoset-1.2.16.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\activation\jakarta.activation-api\1.2.1\jakarta.activation-api-1.2.1.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\3.0.3\mybatis-spring-boot-starter-3.0.3.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\boot\spring-boot-starter-jdbc\3.2.0\spring-boot-starter-jdbc-3.2.0.jar;D:\apache-maven-3.9.10\maven-repository\com\zaxxer\HikariCP\5.0.1\HikariCP-5.0.1.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-jdbc\6.1.1\spring-jdbc-6.1.1.jar;D:\apache-maven-3.9.10\maven-repository\org\springframework\spring-tx\6.1.1\spring-tx-6.1.1.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\3.0.3\mybatis-spring-boot-autoconfigure-3.0.3.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\mybatis\3.5.14\mybatis-3.5.14.jar;D:\apache-maven-3.9.10\maven-repository\org\mybatis\mybatis-spring\3.0.3\mybatis-spring-3.0.3.jar;D:\apache-maven-3.9.10\maven-repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\enterprise\jakarta.enterprise.cdi-api\3.0.0\jakarta.enterprise.cdi-api-3.0.0.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\el\jakarta.el-api\4.0.0\jakarta.el-api-4.0.0.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\interceptor\jakarta.interceptor-api\2.0.0\jakarta.interceptor-api-2.0.0.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\inject\jakarta.inject-api\2.0.0\jakarta.inject-api-2.0.0.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\ws\rs\jakarta.ws.rs-api\3.0.0\jakarta.ws.rs-api-3.0.0.jar;D:\apache-maven-3.9.10\maven-repository\jakarta\servlet\jakarta.servlet-api\5.0.0\jakarta.servlet-api-5.0.0.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-databind\2.15.3\jackson-databind-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-annotations\2.15.3\jackson-annotations-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\com\fasterxml\jackson\core\jackson-core\2.15.3\jackson-core-2.15.3.jar;D:\apache-maven-3.9.10\maven-repository\org\slf4j\slf4j-api\2.0.12\slf4j-api-2.0.12.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\logging\log4j\log4j-slf4j2-impl\2.23.1\log4j-slf4j2-impl-2.23.1.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\logging\log4j\log4j-api\2.23.1\log4j-api-2.23.1.jar;D:\apache-maven-3.9.10\maven-repository\org\apache\logging\log4j\log4j-core\2.23.1\log4j-core-2.23.1.jar com.example.fundprofit.FundProfitApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.1.5) 2025-07-12T10:34:20.673+08:00 INFO 5860 --- [ main] c.e.f.FundProfitApplication : Starting FundProfitApplication using Java 17.0.15 with PID 5860 (C:\Users\Administrator\Desktop\考题示例\考题示例\demo\target\classes started by Administrator in C:\Users\Administrator\Desktop\考题示例\考题示例\demo) 2025-07-12T10:34:20.680+08:00 INFO 5860 --- [ main] c.e.f.FundProfitApplication : No active profile set, falling back to 1 default profile: "default" 2025-07-12T10:34:20.845+08:00 WARN 5860 --- [ main] o.s.b.d.FailureAnalyzers : FailureAnalyzers [org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer] implement BeanFactoryAware or EnvironmentAware. Support for these interfaces on FailureAnalyzers is deprecated, and will be removed in a future release. Instead provide a constructor that accepts BeanFactory or Environment parameters. 2025-07-12T10:34:20.847+08:00 ERROR 5860 --- [ main] o.s.b.SpringApplication : Application run failed java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExcludeAutoConfigurationsProperty(AutoConfigurationImportSelector.java:205) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE] at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExclusions(AutoConfigurationImportSelector.java:199) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE] at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.selectImports(AutoConfigurationImportSelector.java:96) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE] at org.springframework.context.annotation.ConfigurationClassParser$DefaultDeferredImportSelectorGroup.process(ConfigurationClassParser.java:821) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:796) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:726) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:697) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:182) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:415) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:287) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:779) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597) ~[spring-context-6.0.13.jar:6.0.13] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738) [spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440) [spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) [spring-boot-3.1.5.jar:3.1.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) [spring-boot-3.1.5.jar:3.1.5] at com.example.fundprofit.FundProfitApplication.main(FundProfitApplication.java:11) [classes/:?] Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[?:?] ... 21 more 进程已结束,退出代码为 1 请解释下原因给出方法
最新发布
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值