You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将S3读取的JSON文件转换为List<Name>对象列表?

将S3中的JSON文件转换为List对象列表

我目前使用Java代码从S3存储位置读取JSON文件,但现在只能打印ResponseInputStream。已定义好Name类,希望直接将读取到的流转换为List<Name>对象列表,该如何实现?

JSON文件内容

[
 {
   "name": "A",
   "lastName" : "B"
 },
 {
   "name": "C",
   "lastName" : "D"
 }
]

现有读取S3的代码

AwsBasicCredentials awsSourceBasicCredentials = AwsBasicCredentials.create(accessKey, secretKey);
URI sourceUrl = new URI(ep);
S3Client  s3Client= S3Client.builder()
         .credentialsProvider(StaticCredentialsProvider.create(awsSourceBasicCredentials))
         .region(Region.AWS_GLOBAL)
         .endpointOverride(sourceUrl)
         .build();
ResponseInputStream object = s3Client.getObject(request -> request
                                .bucket(bucketName)
                                .key(key));

定义的Name类

class Name
{
 String name;
 String lastName;
}

解决方案

要实现流到List<Name>的转换,借助JSON序列化库(比如Jackson)即可完成,步骤如下:

  1. 添加Jackson依赖(以Maven为例)
    在pom.xml中加入Jackson Databind依赖:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新稳定版即可 -->
</dependency>
  1. 调整Name类
    Jackson需要类具备公共无参构造方法,以及属性的getter/setter方法(也可使用Lombok的@Data注解简化代码):
class Name {
    private String name;
    private String lastName;

    // 必须的无参构造方法
    public Name() {}

    // Getter和Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
  1. 转换流为List
    使用Jackson的ObjectMapper读取ResponseInputStream并转换为目标列表,同时用try-with-resources自动关闭流避免资源泄漏:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

// ... 原有创建s3Client的代码 ...

try (ResponseInputStream<GetObjectResponse> object = s3Client.getObject(request -> request
                                .bucket(bucketName)
                                .key(key))) {
    ObjectMapper objectMapper = new ObjectMapper();
    // 解决泛型类型擦除问题,指定目标类型为List<Name>
    List<Name> nameList = objectMapper.readValue(object, new TypeReference<List<Name>>() {});
    
    // 后续可直接操作nameList
    for (Name item : nameList) {
        System.out.println("姓名:" + item.getName() + ",姓氏:" + item.getLastName());
    }
} catch (Exception e) {
    e.printStackTrace();
}

补充说明

  • TypeReference<List<Name>>用于规避Java泛型类型擦除的问题,让Jackson能正确识别列表的泛型参数。
  • 如果习惯使用Gson库,逻辑类似,只需替换为Gson类的fromJson方法即可实现转换。

内容的提问来源于stack exchange,提问作者Tanya Bhandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:02