在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反序列化防护指南。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/21941.html