Java创建api以公开csv而不是json
我正在使用Spring Boot开发一个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
// 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方法是实现并注册一个
您可以实现一个专门处理MediaTypetext/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);