Java学习第四十七部分——Web开发(十五)

目录

一. 前言

二. 解析

1. 用户模型类 (User.java)

2. JSON工具类 (JsonUtils.java)

3. 主程序 (Main.java)

4. 依赖配置 (pom.xml)

代码关系图解

三. 特点

四. 技巧

五. 步骤

1.打开idea,创建Java项目,构建系统选“Maven”

2.pom.xml文件内容如下

3.项目结构如下

4.三个类文件内容如下

5.点击页面上方绿色三角,运行结果如下


一. 前言

       本文介绍一个使用 IntelliJ IDEA 创建 Java JSON 处理项目的完整示例,使用 Jackson 库实现对象与 JSON 的相互转换。

二. 解析

1. 用户模型类 (User.java)

package com.example.model;

// 用户数据模型类
public class User {
    // 用户属性
    private String name;        // 姓名
    private int age;            // 年龄
    private String email;       // 邮箱
    
    @JsonFormat(pattern = "yyyy/MM/dd")  // 日期格式化
    private LocalDate registerDate;  // 注册日期
    
    private List<String> skills; // 技能列表

    // 构造方法
    public User() {}  // 必须有无参构造器(JSON转换需要)
    public User(String name, int age, ...) { ... }  // 带参构造器

    // Getter/Setter方法(用于访问私有属性)
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    // ... 其他属性的getter/setter
}

核心作用:定义用户数据结构,包含属性和操作方法。


2. JSON工具类 (JsonUtils.java)

package com.example.util;

// JSON处理工具
public class JsonUtils {
    // 创建并配置Jackson的核心转换器
    private static ObjectMapper createMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());  // 支持Java8时间类型
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性
        mapper.enable(SerializationFeature.INDENT_OUTPUT); // 美化JSON输出
        return mapper;
    }

    // 对象 → JSON字符串
    public static String toJson(Object obj) { ... }
    
    // JSON字符串 → 对象
    public static <T> T fromJson(String json, Class<T> clazz) { ... }
    
    // 自定义JSON异常处理
    public static class JsonException extends RuntimeException { ... }
}

核心作用:提供JSON与Java对象的双向转换功能。


3. 主程序 (Main.java)

package com.example;

// 程序入口
public class Main {
    public static void main(String[] args) {
        // 1. 创建测试用户
        User user = createTestUser();
        
        // 2. 对象转JSON(序列化)
        String json = JsonUtils.toJson(user);
        System.out.println("序列化结果:\n" + json);
        
        // 3. JSON转对象(反序列化)
        User parsedUser = JsonUtils.fromJson(inputJson, User.class);
        
        // 4. 打印结果
        printUserInfo(parsedUser);
    }
    
    // 辅助方法:创建测试用户
    private static User createTestUser() { ... }
    
    // 辅助方法:打印用户信息
    private static void printUserInfo(User user) { ... }
}

核心流程

  1. 创建用户对象 → 2. 转换为JSON → 3. 解析JSON → 4. 输出结果


4. 依赖配置 (pom.xml)

<dependencies>
    <!-- Jackson核心库 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    
    <!-- Java8时间支持 -->
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- 打包可执行JAR -->
        <plugin>
            <configuration>
                <mainClass>com.example.Main</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

核心作用:管理第三方库依赖和项目构建配置。


代码关系图解

  Main.java
     │
     ├─ 创建 → User对象
     │      │
     │      ↓
     ├─ 使用 → JsonUtils.toJson() → 生成JSON
     │
     ├─ 使用 → JsonUtils.fromJson() → 解析JSON → 创建新User对象
     │
     └─ 打印结果

三. 特点

  1. 结构化设计:模型/工具/主程序分离

  2. 安全处理:忽略未知JSON字段

  3. 日期支持:Java 8时间类型处理

  4. 易读输出:格式化JSON美化

  5. 错误处理:自定义异常封装

  6. 简洁接口:静态工具方法调用

四. 技巧

  • 格式化 JSON:任意 JSON 字符串粘到 IDEA → Ctrl + Alt + L 自动美化。

  • 快速生成 JSON:安装插件 java2json,在类名上右键 MakeJson 即可把字段模板一键生成 JSON 样例。

  • Scratch 文件:IDEA 内按 Ctrl+Shift+Alt+Insert → 选 JSON 可临时写/校验 JSON 而不污染项目。

五. 步骤

1.打开idea,创建Java项目,构建系统选“Maven”

 2.pom.xml文件内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>json-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <jackson.version>2.15.3</jackson.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3.项目结构如下

 4.三个类文件内容如下

package com.example.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.time.LocalDate;
import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL) // 忽略null字段
public class User {
    private String name;
    private int age;
    private String email;
    
    @JsonFormat(pattern = "yyyy/MM/dd")
    private LocalDate registerDate;
    
    private List<String> skills;

    // 必须有无参构造器
    public User() {}

    public User(String name, int age, String email, LocalDate registerDate, List<String> skills) {
        this.name = name;
        this.age = age;
        this.email = email;
        this.registerDate = registerDate;
        this.skills = skills;
    }

    // Getter 和 Setter (IDEA 自动生成: Alt+Insert)
    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 getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDate getRegisterDate() {
        return registerDate;
    }

    public void setRegisterDate(LocalDate registerDate) {
        this.registerDate = registerDate;
    }

    public List<String> getSkills() {
        return skills;
    }

    public void setSkills(List<String> skills) {
        this.skills = skills;
    }
}
package com.example.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

public class JsonUtils {
    private static final ObjectMapper mapper = createMapper();

    private static ObjectMapper createMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 配置常用设置
        mapper.registerModule(new JavaTimeModule()); // 支持Java8时间类型
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.enable(SerializationFeature.INDENT_OUTPUT); // 美化输出
        return mapper;
    }

    // 对象转JSON字符串
    public static String toJson(Object obj) {
        try {
            return mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new JsonException("JSON serialization failed", e);
        }
    }

    // JSON字符串转对象
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (JsonProcessingException e) {
            throw new JsonException("JSON deserialization failed", e);
        }
    }

    // 自定义JSON异常
    public static class JsonException extends RuntimeException {
        public JsonException(String message, Throwable cause) {
            super(message, cause);
        }
    }
}
​
package com.example;

import com.example.model.User;
import com.example.util.JsonUtils;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 创建测试用户
        User user = createTestUser();
        
        // 对象 → JSON
        String json = JsonUtils.toJson(user);
        System.out.println("=== 序列化结果 ===");
        System.out.println(json);

        // JSON → 对象
        String inputJson = "{\"name\":\"李四\",\"age\":32,\"email\":\"lisi@test.com\"," +
                "\"registerDate\":\"2022/11/15\",\"skills\":[\"Python\",\"Docker\"]}";
        
        User parsedUser = JsonUtils.fromJson(inputJson, User.class);
        System.out.println("\n=== 反序列化结果 ===");
        printUserInfo(parsedUser);
    }

    private static User createTestUser() {
        return new User(
                "张三",
                28,
                "zhangsan@example.com",
                LocalDate.of(2023, 5, 20),
                Arrays.asList("Java", "Spring", "SQL")
        );
    }

    private static void printUserInfo(User user) {
        System.out.println("姓名: " + user.getName());
        System.out.println("年龄: " + user.getAge());
        System.out.println("邮箱: " + user.getEmail());
        System.out.println("注册日期: " + user.getRegisterDate());
        System.out.println("技能: " + user.getSkills());
    }
}

​

5.点击页面上方绿色三角,运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值