如何从字符串获取Java对象

通过JSON或XML反序列化工具(如Jackson、Gson)将字符串转换为Java对象,需确保字符串格式与目标类结构匹配,调用库的解析方法实现映射,objectMapper.readValue(jsonString, TargetClass.class)`。

在Java开发中,将字符串转换为Java对象是一个常见需求,通常称为反序列化,根据字符串的格式(如JSON、XML或Java原生序列化数据),可采用不同方法实现,以下是详细解决方案:

如何从字符串获取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
    }
}

依赖

如何从字符串获取Java对象

<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对象

⚠️ 注意:此方式有安全风险!仅用于可信数据源。

如何从字符串获取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]));
    }
}

关键注意事项

  1. 安全性
    • 避免直接反序列化不可信数据(如用户输入),可能引发漏洞(如反序列化攻击)。
    • JSON/XML解析更安全,优先选择。
  2. 异常处理
    • 捕获JsonProcessingException(Jackson)、JAXBExceptionClassNotFoundException等异常。
  3. 性能优化
    • 重用ObjectMapperGsonJAXBContext实例(线程安全)。
  4. 兼容性
    • 确保目标类的字段名/类型与字符串内容匹配(Jackson/Gson支持@JsonProperty注解映射字段名)。

总结建议

  • 首选JSON方案:Jackson/Gson高效且安全,适合API交互。
  • XML场景:JAXB适合遗留系统或SOAP协议。
  • 避免原生序列化:除非处理可信的遗留数据。

引用说明参考Oracle官方文档JAXB指南Jackson官网Gson文档,安全建议依据OWASP反序列化防护指南。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/21941.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月13日 03:32
下一篇 2025年6月13日 03:37

相关推荐

  • JavaWeb开发怎么做?

    使用Java进行网页开发主要通过后端技术实现,如Servlet、JSP或Spring Boot框架处理HTTP请求和业务逻辑,结合HTML/CSS/JS前端构建页面,常用Tomcat等服务器部署运行。

    2025年6月13日
    100
  • Java数组如何分配内存?

    在Java中,可以通过两种方式为数组开辟空间:,1. **静态初始化**:声明时直接赋值,如 int[] arr = {1,2,3}; 自动分配空间。,2. **动态初始化**:使用 new 关键字指定长度,如 int[] arr = new int[5]; 开辟5个整型空间,数组长度固定不可变。

    2025年6月9日
    100
  • Java怎样读取图片文件的内容?

    Java可以通过ImageIO.read()方法读取图片文件,转换为BufferedImage对象,进而获取像素数据、尺寸等信息,或使用ImageIO配合InputStream处理网络/资源图片。

    2025年5月30日
    300
  • Java如何输入特殊符号?

    在Java中处理数学符号可通过内置运算符(如+、-、*、/)实现基础计算,复杂运算则依赖Math类的静态方法(例如Math.sin()、Math.pow()),若需解析数学表达式字符串,可引入exp4j等第三方库;符号计算(如代数化简)可选用Symja或Apache Commons Math库的符号模块。

    2025年6月3日
    300
  • Java中与或非运算符怎么用?

    在Java中,使用逻辑运算符:&&表示与(全真为真),||表示或(一真即真),!表示非(取反布尔值),主要用于条件判断和布尔逻辑运算。

    2025年6月9日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN