杰瑞科技汇

Java字符串如何转为对象?

具体使用哪种方法,取决于你想要转换成的对象的类型以及字符串的格式

Java字符串如何转为对象?-图1
(图片来源网络,侵删)

下面我将按照不同的场景,为你详细介绍几种最主流和最实用的方法。


字符串转 JSON 对象(最常用)

如果你的字符串是 JSON 格式,并且你想将其转换成一个 Java 对象(一个自定义的类实例、MapList),那么使用 JSON 库是最佳选择。

使用 Jackson (推荐)

Jackson 是目前最流行、性能最好的 JSON 处理库。

第一步:添加 Jackson 依赖

Java字符串如何转为对象?-图2
(图片来源网络,侵删)

如果你使用 Maven,在 pom.xml 中添加:

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

第二步:创建一个与 JSON 结构匹配的 Java 类 (POJO)

// User.java
public class User {
    private String name;
    private int age;
    private String email;
    // 必须有无参构造函数
    public User() {
    }
    // 推荐:使用 getter 和 setter
    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; }
    // 可选:重写 toString() 方便打印
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

第三步:进行转换

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"张三\",\"age\":30,\"email\":\"zhangsan@example.com\"}";
        // 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 将 JSON 字符串转换为 User 对象
            User user = objectMapper.readValue(jsonString, User.class);
            // 打印结果
            System.out.println(user);
            System.out.println("用户名: " + user.getName());
        } catch (JsonProcessingException e) {
            System.err.println("JSON 解析失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

转换其他 JSON 类型

Java字符串如何转为对象?-图3
(图片来源网络,侵删)
  • Map:

    // 将 JSON 字符串转为 Map<String, Object>
    Map<String, Object> dataMap = objectMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});
    System.out.println(dataMap.get("name")); // 输出: 张三
  • List:

    String jsonArrayString = "[{\"name\":\"李四\",\"age\":25}, {\"name\":\"王五\",\"age\":28}]";
    // 将 JSON 数组字符串转为 List<User>
    List<User> userList = objectMapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});
    System.out.println(userList.get(0).getName()); // 输出: 李四

使用 Gson (Google 的库)

Gson 是另一个非常流行的 JSON 库,使用方式与 Jackson 类似。

第一步:添加 Gson 依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>

第二步:转换

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class Main {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"张三\",\"age\":30,\"email\":\"zhangsan@example.com\"}";
        Gson gson = new Gson();
        // 转换为 User 对象
        User user = gson.fromJson(jsonString, User.class);
        System.out.println(user);
        // 转换为 Map
        Map<String, Object> dataMap = gson.fromJson(jsonString, new TypeToken<Map<String, Object>>() {}.getType());
        System.out.println(dataMap.get("name"));
    }
}

字符串转 XML 对象

如果你的字符串是 XML 格式,你可以使用 JAXB (Java Architecture for XML Binding) 或第三方库如 Dom4J。

使用 JAXB (JDK 内置,JDK 8 及以下需要单独安装)

JAXB 是 Java 标准库的一部分,非常适合处理 XML 和 Java 对象的绑定。

第一步:创建 Java 类并添加注解

import javax.xml.bind.annotation.*;
@XmlRootElement(name = "user") // 对应 XML 的根元素
@XmlAccessorType(XmlAccessType.FIELD) // 指定注解可以放在字段上
public class User {
    @XmlElement(name = "name") // 对应 XML 的元素名
    private String name;
    @XmlElement(name = "age")
    private int age;
    @XmlElement(name = "email")
    private String email;
    // 必须有无参构造函数
    public User() {
    }
    // getter 和 setter...
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

第二步:进行转换

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class Main {
    public static void main(String[] args) {
        String xmlString = "<user><name>李四</name><age>35</age><email>lisi@example.com</email></user>";
        try {
            // 1. 创建 JAXBContext,传入需要转换的类
            JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
            // 2. 创建 Unmarshaller(反序列化器)
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            // 3. 将 XML 字符串转换为 User 对象
            User user = (User) unmarshaller.unmarshal(new StringReader(xmlString));
            // 4. 打印结果
            System.out.println(user);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

字符串转 Java 内置类型

对于一些简单的 Java 内置类型,可以直接使用其包装类的 parseXxx() 方法或 valueOf() 方法。

目标类型 方法示例 备注
int int num = Integer.parseInt("123"); 如果字符串格式不正确(如 "abc"),会抛出 NumberFormatException
Integer Integer num = Integer.valueOf("123"); valueOf 会返回一个缓存的对象,parseInt 返回基本类型 int
long long num = Long.parseLong("123456789"); 同样可能抛出 NumberFormatException
double double num = Double.parseDouble("3.14"); 同样可能抛出 NumberFormatException
boolean boolean flag = Boolean.parseBoolean("true"); 对大小写不敏感,"true", "TRUE", "1" 都会返回 true
Date Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2025-10-27"); 需要指定日期格式,线程不安全,推荐使用 java.time 包下的类。

示例:

public class Main {
    public static void main(String[] args) {
        String strNum = "100";
        int num = Integer.parseInt(strNum);
        System.out.println(num + 10); // 输出 110
        String strBool = "true";
        boolean isActive = Boolean.parseBoolean(strBool);
        System.out.println(isActive); // 输出 true
    }
}

字符串转自定义对象(无特定格式)

如果字符串是一个自定义的、非标准格式("name:张三;age:30"),你需要手动编写解析逻辑。

方法:

  1. 使用 String.split() 方法分割字符串。
  2. 使用 String.substring(), String.indexOf() 等方法提取子串。
  3. 将提取出的子串用上述方法(如 Integer.parseInt)转换成相应的数据类型,并赋值给对象的字段。

示例:

public class Main {
    public static void main(String[] args) {
        String customString = "name:张三;age:30;email:zhangsan@example.com";
        User user = new User();
        String[] parts = customString.split(";");
        for (String part : parts) {
            String[] keyValue = part.split(":");
            if (keyValue.length == 2) {
                String key = keyValue[0];
                String value = keyValue[1];
                switch (key) {
                    case "name":
                        user.setName(value);
                        break;
                    case "age":
                        user.setAge(Integer.parseInt(value));
                        break;
                    case "email":
                        user.setEmail(value);
                        break;
                }
            }
        }
        System.out.println(user);
    }
}

总结与选择建议

字符串格式 目标对象类型 推荐方法 优点 缺点
JSON 任何 Java 对象 Jackson / Gson 功能强大、灵活、性能好、生态成熟 需要引入第三方库
XML 任何 Java 对象 JAXB Java 标准(JDK 7+),无需额外库 注解侵入性强,配置略显繁琐
CSV / 自定义分隔符 List 或自定义对象 OpenCSV / 手动解析 OpenCSV 功能强大,能处理复杂CSV 手动解析代码量多,易出错
简单键值对 Map String.split() 简单直接 不适合复杂结构
Java 内置类型 int, long, Date parseXxx() / valueOf() 标准库方法,无需依赖 只能处理简单类型,格式要求严格
无特定格式 自定义对象 手动解析 灵活性最高 代码冗长,维护成本高,容易出错

核心建议:

  1. 优先使用标准格式:尽量让数据以 JSON 或 XML 的格式进行存储和传输。
  2. 首选 Jackson:在处理 JSON 时,Jackson 是事实上的标准,性能和功能都非常出色。
  3. 处理异常:所有解析操作都可能失败(如格式错误),务必使用 try-catch 块来捕获 ParseException, JsonProcessingException 等异常,保证程序的健壮性。
  4. 为 POJO 提供无参构造函数:几乎所有的反序列化库(Jackson, Gson, JAXB)都要求目标类有一个公共的无参构造函数。
分享:
扫描分享到社交APP
上一篇
下一篇