如何将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)即可完成,步骤如下:
- 添加Jackson依赖(以Maven为例)
在pom.xml中加入Jackson Databind依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版即可 --> </dependency>
- 调整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; } }
- 转换流为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
相关产品推荐
相关产品推荐

