因此,我试图将一个JSON文件(我使用Google Sheets API将其导出为JSON)转换为CSV文件,即使在该位置正确放置了一个JSON文件,或者try 使用字符串,它要么显示空指针异常,要么返回一个空CSV文件.

示例JSON文件:

{
  "range": "products!A1:E4",
  "majorDimension": "ROWS",
  "values": [
    [
      "product_name",
      "price"
    ],
    [
      "Rugrats - Bedtime Bash [VHS]",
      "36.95"
    ],
    [
      "Teenage Mutant Ninja Turtles II - The Secret of the Ooze [VHS]",
      "29.89"
    ],
    [
      "Teenage Mutant Ninja Turtles II - The Secret of the Ooze [VHS]",
      "29.89"
    ]
  ]
}

我在这里try 使用的示例代码将它们转换为CSV,

JSONObject output = new JSONObject(<String or file location that holds JSON file>);
File finalFile=new File(<Destination file path>);
JSONArray docs = output.getJSONArray("values");
String csv = CDL.toString(docs);
FileUtils.writeStringToFile(finalFile, csv);

我是否在代码中犯了错误,或者应该用不同的Java代码处理这个JSON?

推荐答案

为什么不直接从Sheets API响应中写入(本例摘自Java Sheet API quick-start)

public static void main(String... args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    final String spreadsheetId = "<SHEET_ID>";
    final String range = "<SHEET_RANGE>";
    Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
            .setApplicationName(APPLICATION_NAME)
            .build();
    ValueRange response = service.spreadsheets().values()
            .get(spreadsheetId, range)
            .execute();
    List<List<Object>> values = response.getValues();
    if (values == null || values.isEmpty()) {
        System.out.println("No data found.");
    } else {
        /* Create a new writer */
        PrintWriter writer = new PrintWriter("data.csv");
        for (List<Object> list : values) {
            /* Building the string */
            StringBuilder str = new StringBuilder();
            str.append(list.get(0).toString() + ",");
            str.append(list.get(1).toString() + "\n");
            writer.write(str.toString());
        }
        /* Closing the writer */
        writer.close();
    }
}

在任何情况下,如果正确读取JSON对象,机制都是完全相同的.

Updated

如果您想直接从JSON中读取,可以使用以下示例(使用GSON):

public class SheetResponse {
    private String range;
    private String majorDimensions; 
    private List<List<Object>> values;
}

public static void main(String... args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
    var gson = new Gson();
    var reader = new JsonReader(new FileReader("test.json"));
    SheetResponse sR = gson.fromJson(reader, SheetResponse.class);
    PrintWriter writer = new PrintWriter("data.csv");
    for (List<Object> list : sR.values) {
        /* Building the string */
        StringBuilder str = new StringBuilder();
        str.append(list.get(0).toString() + ",");
        str.append(list.get(1).toString() + "\n");
        writer.write(str.toString());
    }
    /* Closing the writer */
    writer.close();
}
Updated for the general case
public static void main(String... args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
    var gson = new Gson();
    var reader = new JsonReader(new FileReader("test.json"));
    SheetResponse sR = gson.fromJson(reader, SheetResponse.class);
    PrintWriter writer = new PrintWriter("data.csv");

    for (int i = 0; i < sR.values.size(); i++) {
        var valueRow = sR.values.get(i);
        StringBuilder str = new StringBuilder();
        for (int j = 0; j < valueRow.size(); j++) {
            if (j == valueRow.size() - 1) {
                str.append(valueRow.get(j).toString() + "\n");
            } else {
                str.append(valueRow.get(j).toString() + ",");
            }
        }
        writer.write(str.toString());
    }
    /* Closing the writer */
    writer.close();
}
Documentation

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

屏蔽字母数字代码的Java正则表达式

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

在bash中将数组作为Java程序的参数传递

如何找到MongoDB文档并进行本地化?

具有多种令牌类型和段的复杂Java 17正则表达式

如何在Java中从XML中获取特定的 node ,然后将其删除?

Java-动态绑定-问题-了解

如何让JVM在SIGSEGV崩溃后快速退出?

SonarLint:只能有条件地调用方法(S)

Kotlin Val是否提供了与Java最终版相同的可见性保证?

将关闭拍卖的TimerService

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

如何在Java springboot中从一个端点发送多个时间响应?

何时调用密封层次 struct 的switch 中的默认情况

JavaFX标签中的奇怪字符

无法在Java中获取ElastiCache的AWS CloudWatch指标

睡眠在 Spring Boot 中

JAVA 正则表达式识别字符串string或字符串内的字符char