【问题标题】:Java Parse String in Class Instance类实例中的 Java 解析字符串
【发布时间】:2021-04-10 17:45:37
【问题描述】:

我想将一个字符串解析为一个类实例。 我的数据来自 .csv。

代码:

@Override
public List<Strasse> getByStadtId(Stadt stadtId){
    return repo.findByStadtId(stadtId);
}

@Override
public void saveStrassenData() {
    StringBuilder builder = new StringBuilder();
    try {
        BufferedReader bufferReader = new BufferedReader(new FileReader("src/main/resources/csv/strassen.csv"));
        while((line = bufferReader.readLine()) != null) {
            String [] data=line.split(",");
            Strasse strasse = new Strasse();
            Stadt stadt = new Stadt();
            strasse.setId(Long.parseLong(data[0]));
            strasse.setName(data[1]);
            strasse.setVerwaltungsKuerzel(data[2]);
            strasse.setStadt(data[3]);
            repo.save(strasse);
        } 
    
    }
    catch (IOException e) {
        //TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在图 1 中你可以看到我的错误。

Picture of the Code

我的班级在图片中:

.csv

【问题讨论】:

  • 创建一个解析字符串并将其转换为所需对象的函数。您是否将 json 作为字符串传递?
  • 你试过String.valueOf()吗?
  • 您正在调用 setStadt(),它采用 Stadt 的实例,但您传入的是 data[3],它是 String
  • 是的。我想从我的 .csv 写入数据库。

标签: java spring-boot csv


【解决方案1】:

setStadt 不接受字符串。您需要创建一个 Stadt 实例,然后您可以将其设置为 id

类似的东西:

Stadt stadt = new Stadt();
stadt.setId(data[3]);
strasse.setStadt(stadt);

【讨论】:

  • 我得到这个错误 -> java.lang.NumberFormatException: For input string: "1"
  • 谢谢,我发现了错误 :) 我在 .csv 中有一个拼写错误^^
【解决方案2】:

缺少对 Stadt 的处理和对 Strasse 的验证。

@Override
public void saveStrassenData() {
    Charset charset = StandardCharsets.ISO_8859_1; // Or UTF_8.
    try (InputStream in = getClass().getResourceAsStream("/csv/strassen.csv");
            BufferedReader bufferReader = new BufferedReader(
                new InputStreamReader(in, charset))) {
        while((line = bufferReader.readLine()) != null) {
            String[] data=line.split(",\\s*");
            Strasse straße = new Strasse();

            long stadtId = Long.parseLong(data[3]);
            Stadt stadt = new Stadt(); // repo.getStadtById(stadtId);
            stadt.setId(stadtId);      //

            straße.setId(Long.parseLong(data[0]));
            straße.setName(data[1]);
            straße.setVerwaltungsKuerzel(data[2]);
            straße.setStadt(stadt;     // <--
            repo.save(straße);
        } 
    
    }
    catch (IOException e) { // Better method with throws IOException.
        e.printStackTrace(); // Log.
    }
}

此外,旧实用程序类 FileReader 使用默认字符集,用于德语 Windows Cp-1252,它是 ISO-8859-1 的超集。对于可能是 UTF-8 的服务器。更好地明确说明字符集,尤其是当您自己将其作为只读资源提供时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多