如何使用 Java 将 InputStream 转换为 JsonArray 对象

How to convert InputStream to JsonArray Object using Java

我正在尝试将 InputStream 转换为 JSON Array object 但没有正确获取 JSON 对象,请在下面找到我的 inputStream 记录:

{"id":4,"productId":9949940,"data":"product data 1","productPrice":"653.90"}
{"id":5,"productId":4940404,"data":"product data 2","productPrice":"94.12"}

我为每个项目和最后一条记录添加了额外的逗号 - 请在下面找到 java 代码。有人可以帮我解决这个问题吗?提前感谢您的帮助。谢谢!

Product.java

public void getProduct() {

    String bucketName = "myProductBucket";
    String key = "products/product-file";
            StringBuilder sb = null;
            JSONArray jsonArray = new JSONArray();
            try(InputStream inputStream = s3Service.getObjectFromS3(bucketName, key);) {
                sb = new StringBuilder();
                sb.append("[");
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while((line = reader.readLine()) != null) {
                    sb.append(line).append(",");
                }
                sb.append("]");

            } catch (IOException e) {
                e.printStackTrace();
            }

            System.out.println(sb.toString());
}

输出:

[{"id":4,"productId":9949940,"data":"product data 1","productPrice":"653.90"},,
{"id":5,"productId":4940404,"data":"product data 2","productPrice":"94.12"},]

预期输出:

[{"id":4,"productId":9949940,"data":"product data 1","productPrice":"653.90"},
{"id":5,"productId":4940404,"data":"product data 2","productPrice":"94.12"}]

AFAIU,这是预料之中的,因为您的 JSON 对象仅部分有效。

虽然它也不是有效的 JSON 数组,但经过小的修改后可以解析为 JSONArray(注意开始和结束括号以及对象之间的逗号):

[
{"id":4,"productId":9949940,"data":"product data 1","productPrice":"653.90"},
{"id":5,"productId":4940404,"data":"product data 2","productPrice":"94.12"}
]

或者,您可以手动将输入拆分为单独的 JSON 个对象,然后一个一个地解析它们。

根据您的产品详细信息文件,您的文件中没有有效的 JSON 数组对象。因此,无法直接从文件创建 JSON 数组。

您可以做的是,一条一条地阅读产品线并创建JSON对象并将其转换为JSON数组。请在下面找到可以提供帮助的代码。

Scanner s = new Scanner(new File("filepath")); //Read the file
JSONArray jsonArray = new JSONArray();

while (s.hasNext()){
   JSONObject jsonObject = new JSONObject(s.next());
   jsonArray.put(jsonObject);
}
//jsonArray can be print by iterating through it.

这是您可以使用的代码,想法是 InputStream 不代表有效的 JSON 因此您必须使用 StringBuilder 将其转换为有效的 JSON 字符串。但首先,您需要处理无效的 JSON。

        StringBuilder sb;
        try(InputStream inputStream = new FileInputStream(new File("Path"))) {
            sb = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        JSONArray jsonArray = new JSONArray(sb.toString());

依赖关系

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20211205</version>
</dependency>

从文件内容中获取 StreamList<String>

        FileReader fileReader = null;
        try {
            File file = new File("path");
            InputStream inputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            List<String> list = bufferedReader.lines().collect(Collectors.toList());
            JSONArray array = new JSONArray();
            for (String s : list) {
                array.put(new JSONObject(s));
            }
            bufferedReader.close();
            System.out.println(array);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (Objects.nonNull(null)) {
                fileReader.close();
            }
        }

依赖关系:

    <dependency>
         <groupId>org.json</groupId>
         <artifactId>json</artifactId>
         <version>20220320</version>
    </dependency>