簡體   English   中英

JSON轉換為CSV錯誤-java.lang.NullPointerException

[英]JSON to CSV error - java.lang.NullPointerException

我正在嘗試使用Java將JSON文件轉換為CSV文件。 我是新手。

我正在關注https://github.com/Arkni/json-to-csv教程。

我收到了NullPointerException。

任何幫助表示贊賞。

我的代碼:

test.java

List<Map<String, String>> flatJson;
flatJson = JSONFlattener.parseJson(new File("/C:/Users/file/path/input.json"), "UTF-8");
!!---CSVWriter.writeToFile(CSVWriter.getCSV(flatJson, ";"), "/C:/Users/file/path/output.csv");--!!

錯誤行: CSVWriter.writeToFile(CSVWriter.getCSV(flatJson, ";"), "/C:/Users/file/path/output.csv");

CSVWriter.java:

 private static final Logger LOGGER = Logger.getLogger(CSVWriter.class);

    public static String getCSV(List<Map<String, String>> flatJson) {
        return getCSV(flatJson, ",");
    }

    public static String getCSV(List<Map<String, String>> flatJson, String separator) {
       !!!-- ***Set<String> headers = collectHeaders(flatJson);***---!!!!
        String csvString = StringUtils.join(headers.toArray(), separator) + "\n";

     !!!!---   ***for (Map<String, String> map : flatJson) {***---!!!
            csvString = csvString + getSeperatedColumns(headers, map, separator) + "\n";
        }

        return csvString;
    }

    public static void writeToFile(String csvString, String fileName) {
        try {
            FileUtils.write(new File(fileName), csvString);
        } catch (IOException e) {
            LOGGER.error("CSVWriter#writeToFile(csvString, fileName) IOException: ", e);
        }
    }

    private static String getSeperatedColumns(Set<String> headers, Map<String, String> map, String separator) {
        List<String> items = new ArrayList<String>();
        for (String header : headers) {
            String value = map.get(header) == null ? "" : map.get(header).replaceAll("[\\,\\;\\r\\n\\t\\s]+", " "); 
            items.add(value);
        }

        return StringUtils.join(items.toArray(), separator);
    }

    private static Set<String> collectHeaders(List<Map<String, String>> flatJson) {
        Set<String> headers = new LinkedHashSet<String>();

        for (Map<String, String> map : flatJson) {
            headers.addAll(map.keySet());
        }

        return headers;
    }

錯誤行:

Set<String> headers = collectHeaders(flatJson);

for (Map<String, String> map : flatJson) {

錯誤:

Exception in thread "main" java.lang.NullPointerException
    at test2.CSVWriter.collectHeaders(CSVWriter.java:134)
    at test2.CSVWriter.getCSV(CSVWriter.java:49)
    at test2.test2.main(test.java:20)

我懷疑您嘗試讀取的JSON文件不存在,在讀取該文件時存在其他I / O錯誤,或者該文件包含格式錯誤的JSON。

不幸的是,您正在使用的parseJson方法中的錯誤處理還有很多不足之處。 這是它的全部文本( source ):

public static List<Map<String, String>> parseJson(URI uri, String encoding) {
    List<Map<String, String>> flatJson = null;
    String json = "";

    try {
        json = IOUtils.toString(uri, encoding);
        flatJson = parseJson(json);
    } catch (IOException e) {
        LOGGER.error("JsonFlattener#ParseJson(uri, encoding) IOException: ", e);
    } catch (Exception ex) {
        LOGGER.error("JsonFlattener#ParseJson(uri, encoding) Exception: ", ex);
    }

    return flatJson;
}

如果在讀取文件或解析JSON時引發異常,則它將消息寫入LOGGER (Log4J記錄器),然后返回null 當您形容自己是新手時,我猜想Log4J的設置不正確(您可能已經看到有關log4j.properties或log4j.xml文件的消息),因此日志記錄無法正常工作,錯誤消息會丟失,您無法找出問題所在。

第一步,我只是避免調用此方法。 而不是寫作

List<Map<String, String>> flatJson;
flatJson = JSONFlattener.parseJson(new File("/C:/Users/file/path/input.json"), "UTF-8");
CSVWriter.writeToFile(CSVWriter.getCSV(flatJson, ";"), "/C:/Users/file/path/output.csv");

改寫以下內容:

List<Map<String, String>> flatJson;
String json = IOUtils.toString(new File("/C:/Users/file/path/input.json"), "UTF-8");
flatJson = JSONFlattener.parseJson(json);
CSVWriter.writeToFile(CSVWriter.getCSV(flatJson, ";"), "/C:/Users/file/path/output.csv");

您可能需要添加一行import org.apache.commons.io.IOUtils; 並處理其他一些異常,但是這些異常應該可以告訴您出了什么問題。

但是,進一步研究該庫的源代碼后,這可能並沒有太大幫助。 在其他地方,它僅捕獲Exception ,將通用消息寫入日志並返回null 您可能需要在其他地方尋找更好的替代庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM