如何使用Java读取S3中存在的JSON文件

rog*_*hat 6 java parsing json amazon-s3 amazon-web-services

我在S3中有一个JSON文件url,我需要解析并从中提取信息。如何在Java中做到这一点?

我已经研究了一些主要使用Python 的解决方案,但不能用Java做到这一点。

我可以使用阅读内容

S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, key));
InputStream objectData = object.getObjectContent();
Run Code Online (Sandbox Code Playgroud)

但我不想下载文件并保留它。我只需要能够使用Gson解析此JSON文件。

我该如何实现?

小智 6

有点晚了,但我会在这里留下这个答案,以防其他人遇到这个问题。

如果您不限于使用 Gson,那么我建议您使用 Jackson 的 ObjectMapper。

第 1 步:将 Jackson 依赖项添加到您的项目中。

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.3'
Run Code Online (Sandbox Code Playgroud)

步骤 2:创建一个普通旧 Java 对象 (POJO),它表示要解析的 JSON 流。例如:

Class Item {
  
  public Item() { }

  private Integer id;
  private String name;
  ....
  // getters and setters

Run Code Online (Sandbox Code Playgroud)

步骤 3:创建一个 ObjectMapper 实例并将 JSON 中的值读取到 POJO 类的实例中。

ObjectMapper objectMapper = new ObjectMapper();
S3Object s3Object = amazonS3.getObject(new GetObjectRequest(bucketName, key));
Item item = objectMapper.readValue(s3Object.getObjectContent(), Item.class);
Run Code Online (Sandbox Code Playgroud)


aru*_*run 5

(只是扩大上面给出的评论。)

遵循S3ObjectWrapper 中的方法,我们可以有一个这样的方法:

private static String getAsString(InputStream is) throws IOException {
    if (is == null)
        return "";
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(is, StringUtils.UTF8));
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
    } finally {
        is.close();
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用这个方法:

S3Object o = s3.getObject(bucketName, key);
S3ObjectInputStream s3is = o.getObjectContent();
String str = getAsString(s3is);
Run Code Online (Sandbox Code Playgroud)


F_S*_*O_K 3

S3 是一个 blob 存储,它无法为您解析文件。如果您想解析 AWS 端的数据,您最好将文件存储在 DynamoDB 中,因为它可以理解 json 文档。

如果这不是一个选择,那么您的选择是正确的。只需将该输入流转换为 json 文件,然后在内存中解析它即可。任何时候都不需要将文件实际写入磁盘。除非它是一个巨大的文件,否则您应该能够在内存中完成它,没有问题。