杰瑞科技汇

Java对象如何转换为目标对象?

  1. 将一个 Java 对象(通常是 Object 类型)转换为一个更具体的、已知的类(或接口)的对象。 这是最常见的情况,本质是 类型转换
  2. 将一个 Java 对象转换为另一种格式的对象,JSON、XML 或另一个 Java 类的实例。 这通常涉及 序列化/反序列化对象映射
  3. 将一个 Java 对象转换为其 JSON 字符串表示,或者反过来。 这也属于第 2 种情况,但非常普遍。

下面我将针对这三种情况,为你提供详细的解释和代码示例。


Java 对象的向下转型

这是最基础的 "对象转换",当你有一个 Object 类型的引用,但你确定它实际上是一个 Person 类的对象时,你需要将其转换回 Person 类型,才能调用 Person 类特有的方法。

核心概念

  • 向上转型:子类对象赋值给父类引用,这个过程是自动的,也是安全的。
    Animal a = new Dog(); // Dog 是 Animal 的子类,自动转型
  • 向下转型:父类引用赋值给子类引用,这个过程需要强制转换,并且不安全,可能会导致 ClassCastException(类型转换异常)。

如何安全地进行向下转型?

使用 instanceof 操作符进行判断,确保对象的真实类型是你期望的类型,然后再进行强制转换。

示例代码:

// 1. 定义一个父类和子类
class Animal {
    void eat() {
        System.out.println("Animal is eating.");
    }
}
class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking.");
    }
}
class Cat extends Animal {
    void meow() {
        System.out.println("Cat is meowing.");
    }
}
public class Main {
    public static void main(String[] args) {
        // 2. 创建一个 Object 类型的数组,里面存放着不同的子类对象
        Object[] objects = {new Dog(), new Cat(), "I am a String", new Animal()};
        // 3. 遍历数组,并根据实际类型进行转换
        for (Object obj : objects) {
            if (obj instanceof Dog) {
                // 安全地将 obj 转换为 Dog 类型
                Dog dog = (Dog) obj;
                dog.eat(); // 调用父类方法
                dog.bark(); // 调用子类特有方法
            } else if (obj instanceof Cat) {
                // 安全地将 obj 转换为 Cat 类型
                Cat cat = (Cat) obj;
                cat.eat();
                cat.meow();
            } else if (obj instanceof Animal) {
                // 如果不是 Dog 或 Cat,但它是 Animal,可以安全转型
                Animal animal = (Animal) obj;
                animal.eat();
                // animal.bark(); // 编译错误,因为编译器只知道它是 Animal,不知道是 Dog
            } else {
                System.out.println("Object is not an Animal: " + obj);
            }
        }
    }
}

输出:

Animal is eating.
Dog is barking.
Animal is eating.
Cat is meowing.
Animal is eating.
Object is not an Animal: I am a String
Animal is eating.

对象到 JSON 的转换 (以及反向)

在现代 Web 开发中,这是最频繁的需求之一,通常使用第三方库,如 JacksonGsonFastjson,这里以最流行的 Jackson 为例。

Java 对象 -> JSON 字符串 (序列化)

步骤:

  1. 添加 Jackson 依赖到你的项目中 (Maven/Gradle)。
  2. 创建一个 Java 类(POJO - Plain Old Java Object)。
  3. 使用 ObjectMapper 将对象转换为 JSON 字符串。

Maven 依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>

示例代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
// 1. 定义一个 POJO 类
class User {
    private String name;
    private int age;
    private String email;
    // Jackson 要求有无参构造函数
    public User() {
    }
    // 推荐:使用构造函数、getter 和 setter
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    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; }
    @Override
    public String toString() {
        return "User{" + "name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + '}';
    }
}
public class Main {
    public static void main(String[] args) {
        // 2. 创建 User 对象
        User user = new User("Alice", 30, "alice@example.com");
        // 3. 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 4. 将对象转换为 JSON 字符串
            String jsonString = objectMapper.writeValueAsString(user);
            System.out.println("Java Object -> JSON:");
            System.out.println(jsonString);
            // 也可以格式化输出 (美化)
            String prettyJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
            System.out.println("\nFormatted JSON:");
            System.out.println(prettyJsonString);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出:

Java Object -> JSON:
{"name":"Alice","age":30,"email":"alice@example.com"}
Formatted JSON:
{
  "name" : "Alice",
  "age" : 30,
  "email" : "alice@example.com"
}

JSON 字符串 -> Java 对象 (反序列化)

示例代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
    public static void main(String[] args) {
        // 1. 准备一个 JSON 字符串
        String jsonString = "{\"name\":\"Bob\",\"age\":25,\"email\":\"bob@example.com\"}";
        // 2. 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 3. 将 JSON 字符串转换为 Java 对象
            // 第二个参数 User.class 指明了要转换的目标类型
            User user = objectMapper.readValue(jsonString, User.class);
            // 4. 验证结果
            System.out.println("JSON -> Java Object:");
            System.out.println(user);
            System.out.println("Name: " + user.getName());
            System.out.println("Age: " + user.getAge());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出:

JSON -> Java Object:
User{name='Bob', age=25, email='bob@example.com'}
Name: Bob
Age: 25

从一个 Java 对象转换到另一个 Java 对象

这在数据传输和不同模块间解耦时非常常见,将数据库的 Entity 对象转换为 API 返回的 DTO (Data Transfer Object) 对象。

方法 1:手动转换 (最直接,但繁琐)

// 假设这是从数据库获取的实体类
class UserEntity {
    private Long id;
    private String username;
    private String passwordHash;
    // getters & setters
}
// 假设这是要返回给前端的 DTO 类,不应包含密码
class UserDto {
    private Long id;
    private String username;
    // getters & setters
}
public class Main {
    public static void main(String[] args) {
        UserEntity entity = new UserEntity();
        entity.setId(1L);
        entity.setUsername("charlie");
        entity.setPasswordHash("some-secret-hash");
        // 手动转换
        UserDto dto = new UserDto();
        dto.setId(entity.getId());
        dto.setUsername(entity.getUsername());
        System.out.println(dto);
    }
}

方法 2:使用对象映射库 (推荐,如 ModelMapper, MapStruct)

手动转换代码冗余且容易出错,使用专门的库可以简化这个过程。

以 ModelMapper 为例:

Maven 依赖:

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>3.1.1</version> <!-- 使用最新版本 -->
</dependency>

示例代码:

import org.modelmapper.ModelMapper;
// UserEntity 和 UserDto 类同上
public class Main {
    public static void main(String[] args) {
        // 1. 创建 ModelMapper 实例
        ModelMapper modelMapper = new ModelMapper();
        UserEntity entity = new UserEntity();
        entity.setId(1L);
        entity.setUsername("charlie");
        entity.setPasswordHash("some-secret-hash");
        // 2. 直接进行映射
        // ModelMapper 会根据字段名自动进行匹配
        UserDto dto = modelMapper.map(entity, UserDto.class);
        System.out.println(dto);
    }
}

这种方法非常简洁,ModelMapper 会自动将 entity 中同名的字段值复制到 dto 中。

场景 核心概念 关键技术/工具 示例
转换到已知子类 类型安全 instanceof 关键字、强制转换 (Type) if(obj instanceof Dog) Dog d = (Dog)obj;
转换到 JSON 序列化/反序列化 Jackson, Gson, Fastjson objectMapper.writeValueAsString(obj)
转换到另一个 Java 类 对象属性映射 ModelMapper, MapStruct, 手动 modelMapper.map(source, TargetClass.class)

理解你的具体需求是选择正确方法的关键,希望这个详细的解释能帮助你解决 "java object 转对象" 的问题!

分享:
扫描分享到社交APP
上一篇
下一篇