Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java创建api以公开csv而不是json_Java_Csv_Spring Boot - Fatal编程技术网

Java创建api以公开csv而不是json

Java创建api以公开csv而不是json,java,csv,spring-boot,Java,Csv,Spring Boot,我正在使用Spring Boot开发一个Java api,我想创建一个控制器,将数据库中的数据导出到csv中,用户可以下载 这是我制作Json响应的一个例子 // get chart @SuppressWarnings("unchecked") public Object getChart() { // build clean object JSONObject contents = new JSONObject(); //inverse bubble chart

我正在使用Spring Boot开发一个Java api,我想创建一个控制器,将数据库中的数据导出到csv中,用户可以下载

这是我制作Json响应的一个例子

// get chart
@SuppressWarnings("unchecked")
public Object getChart() {

    // build clean object
    JSONObject contents = new JSONObject();

    //inverse bubble chart
    JSONObject chart = new JSONObject();
    chart.put("label", "250 applicants");
    chart.put("value", 120);

    contents.put("chart", chart);
    contents.put("number", "0202 000 000");

    JSONObject json = new JSONObject();

    json.put("contents", contents);

    return json;
}
我看过这个例子——但是它是从reactjs框架调用的——所以不确定如何获取HttpServletResponse

我会像往常一样调用api吗

//api/getMyCsv
@SuppressWarnings("unchecked")
@RequestMapping(value = {"/api/getMyC"}, method = RequestMethod.GET)
@CrossOrigin(origins = {"*"})
public ResponseEntity<?> getHome(
        //HttpServletRequest request
        ) throws Exception {


            JSONObject chart = getChart();

            JSONArray data = new JSONArray();
                            data.add(chart);

             //create empty response
             JSONObject response = new JSONObject();

             //create success response
             response.put("data", data);
             response.put("status", "success");
             response.put("msg", "fetched csv");


            return new ResponseEntity<>(response, HttpStatus.OK);
}

CSV只是commas分离v值,对吗?
例如,您可以将一行数据表示为一个类。 取一个地址:

我的街道,我的城市,我的国家

如果我想将该数据表示为一个类,然后再表示为CSV数据,我会创建一个类似这样的类:

public class AddressCSV{

   private String street;
   private String town;
   private String country;

   public AddressCSV(String street, String town, String country){
      this.street = street;
      this.town = town;
      this.country = country;
   }

   // getters and setters here

  // here you could have a method called generateCSV() for example

  // or you could override the toString() method like this

  @Override
  public String toString(){
     return street + "," + town + "," + country + "\n";  // Add the '\n' if you need a new line 
  }
}
然后,您可以使用与
JSONObject
相同的方法来使用它,除了返回整个对象之外,
returnaddress.toString()

这当然是一个非常简单的例子。如果您有很多东西要构建,请签出
StringBuilder

重写
toString()
方法意味着您可以执行诸如传递对象之类的操作,如
System.out.printline(address)
,它将打印CSV。

帮助(取消)封送数据的Spring方法是实现并注册一个

您可以实现一个专门处理MediaType
text/csv
,并支持您决定实现的任何对象类型,例如

  • 列表
    -行是一个bean对象,字段名添加为标题行。
    您甚至可以实现自己的字段注释来控制列顺序和标题行值。
    您还可以让它理解JAXB和/或JSON注释

有了这样一个转换器,现在就可以轻松编写返回CSV的控制器方法:

@GetMapping(path="/api/getMyC", produces="text/csv")
public List<String[]> getMyCAsCsv() {
    List<Object[]> csv = Arrays.asList(
        new Object[] { "First Name", "Last Name", "Age" },
        new Object[] { "John"      , "Doe"      , 33    },
        new Object[] { "Jane"      , "Smith"    , 29    }
    );
    return csv;
}
@GetMapping(path=“/api/getMyC”,products=“text/csv”)
公共列表getMyCAsCsv(){
List csv=Arrays.asList(
新对象[]{“名字”、“姓氏”、“年龄”},
新对象[]{“John”,“Doe”,33},
新对象[]{“Jane”,“Smith”,29}
);
返回csv;
}

不要尝试进行基本的字符串欺骗,因为地址(尤其是街道)必须包含逗号、引号或行尾等字符。这很容易搞乱CSV输出。为了生成可解析的CSV输出,需要正确转义这些字符。为此,请使用CSV库

例如:

为了提高性能,可以直接写入
OutputStream
,并在将结果集转储到CSV后向其添加更多内容。在这种情况下,您将希望保持输出打开以供写入。在这种情况下,请拨打:

csvRoutine.setKeepResourcesOpen(true);
在编写结果集之前。您必须在写入后关闭结果集


免责声明:我是这个图书馆的作者。它是开源和免费的。

为什么不使用
StringBuilder
?CSV只是一种文本格式,对吗?或者构建您自己的CSV类,其
toString()
方法以您需要的格式输出字符串?刚刚更新了我的帖子-但不确定从何处开始您的建议-您可以将其放入答案中-@bot\u botYes,它应该以同样的方式工作。在响应实体中,您的“数据”是CSV字符串,这是一个糟糕的解决方案,因为地址,尤其是
街道
必须包含逗号、引号或行尾等字符。为了生成可解析的CSV输出,需要正确转义这些内容。使用CSV库来代替。是的,我同意,这只是一个例子,它说明了解决方案是如何工作的。
ResultSet rs = queryDataFromYourDb();
StringWriter output = new StringWriter(); //writing to a String to make things easy

CsvRoutines csvRoutine = new CsvRoutines();
csvRoutine.write(rs, output);

System.out.println(output.toString());
csvRoutine.setKeepResourcesOpen(true);