首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JSON到CSV错误- java.lang.NullPointerException

从JSON到CSV错误- java.lang.NullPointerException
EN

Stack Overflow用户
提问于 2018-03-28 19:45:54
回答 1查看 395关注 0票数 1

我试图使用Java将JSON文件转换为CSV文件。我是新手。

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

我得到了一个NullPointerException。

任何帮助都是非常感谢的。

我的代码:

test.java

代码语言:javascript
复制
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");--!!

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

CSVWriter.java:

代码语言:javascript
复制
 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;
    }

Error_line:

Set<String> headers = collectHeaders(flatJson);

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

错误:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-28 22:04:24

我怀疑您试图读取的JSON文件要么不存在,要么读取它时有其他I/O错误,要么它包含格式错误的JSON。

不幸的是,您正在使用的parseJson方法中的错误处理还存在很多不理想之处。下面是它的全文(来源):

代码语言:javascript
复制
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文件未被找到的消息),因此日志记录不起作用,错误消息丢失,您也找不到问题所在。

作为第一步,我将简单地避免调用此方法。而不是写作

代码语言:javascript
复制
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");

相反,请写以下内容:

代码语言:javascript
复制
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。您可能需要在其他地方寻找更好的替代库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49542939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档