上一篇                     
               
			  如何从字符串获取Java对象
- 后端开发
- 2025-06-13
- 4843
 通过JSON或XML反序列化工具(如Jackson、Gson)将字符串转换为Java对象,需确保字符串格式与目标类结构匹配,调用库的解析方法实现映射,objectMapper.readValue(jsonString, TargetClass.class)`。
 
在Java开发中,将字符串转换为Java对象是一个常见需求,通常称为反序列化,根据字符串的格式(如JSON、XML或Java原生序列化数据),可采用不同方法实现,以下是详细解决方案:
JSON格式字符串 → Java对象
JSON是最常用的数据交换格式,推荐使用成熟库处理:
使用Jackson库
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonToObject {
    public static void main(String[] args) {
        String json = "{"name":"张三","age":25}";
        ObjectMapper mapper = new ObjectMapper();
        try {
            // 目标对象类:Person(需有name和age属性及getter/setter)
            Person person = mapper.readValue(json, Person.class);
            System.out.println(person.getName()); // 输出:张三
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 
依赖(Maven):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency> 
使用Gson库
import com.google.gson.Gson;
public class JsonToObject {
    public static void main(String[] args) {
        String json = "{"name":"李四","email":"li@example.com"}";
        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        System.out.println(user.getEmail()); // 输出:li@example.com
    }
} 
依赖:
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency> 
XML格式字符串 → Java对象
使用JAXB(Java Architecture for XML Binding):

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToObject {
    public static void main(String[] args) {
        String xml = "<Book><title>Java编程</title><price>59.9</price></Book>";
        try {
            JAXBContext context = JAXBContext.newInstance(Book.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Book book = (Book) unmarshaller.unmarshal(new StringReader(xml));
            System.out.println(book.getTitle()); // 输出:Java编程
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 
目标类需加注解:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Book {
    private String title;
    private double price;
    @XmlElement
    public String getTitle() { return title; }
    // 其他getter/setter省略
} 
Java原生序列化字符串 → Java对象
️ 注意:此方式有安全风险!仅用于可信数据源。
import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.util.Base64;
public class DeserializeObject {
public static void main(String[] args) {
// Base64编码的序列化字符串(示例)
String serialized = “rO0ABXNyABpjb20uZXhhbXBsZS5TZXJpYWxpemFibGVPYmqjo…”;
    try {
        byte[] data = Base64.getDecoder().decode(serialized);
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        ObjectInputStream ois = new ObjectInputStream(bais);
        // 目标类必须实现Serializable接口
        MyObject obj = (MyObject) ois.readObject();
        System.out.println(obj.getValue());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
---
### **四、自定义格式字符串 → Java对象**
若字符串为特殊格式(如CSV),需手动解析:
```java
public class CustomParser {
    public static void main(String[] args) {
        String data = "John,Doe,30";
        String[] parts = data.split(",");
        Person person = new Person();
        person.setFirstName(parts[0]);
        person.setLastName(parts[1]);
        person.setAge(Integer.parseInt(parts[2]));
    }
}关键注意事项
- 安全性: 
  - 避免直接反序列化不可信数据(如用户输入),可能引发破绽(如反序列化攻击)。
- JSON/XML解析更安全,优先选择。
 
- 异常处理: 
  - 捕获JsonProcessingException(Jackson)、JAXBException或ClassNotFoundException等异常。
 
- 捕获
- 性能优化: 
  - 重用ObjectMapper、Gson或JAXBContext实例(线程安全)。
 
- 重用
- 兼容性: 
  - 确保目标类的字段名/类型与字符串内容匹配(Jackson/Gson支持@JsonProperty注解映射字段名)。
 
- 确保目标类的字段名/类型与字符串内容匹配(Jackson/Gson支持
总结建议
- 首选JSON方案:Jackson/Gson高效且安全,适合API交互。
- XML场景:JAXB适合遗留系统或SOAP协议。
- 避免原生序列化:除非处理可信的遗留数据。
引用说明参考Oracle官方文档JAXB指南、Jackson官网及Gson文档,安全建议依据OWASP反序列化防护指南。
 
 
 
			 
			 
			 
			