我创建了一个CSV导出器,将JSON格式的字符串转换为对象集合,然后转换为字符串列表。
Gson gson = new Gson();
Type collectionType = new TypeToken<Collection<itemModel>>(){}.getType();
Collection<itemModel> objects = gson.fromJson(jsonString, collectionType);
// jsonString = "[{"name":"A","number":25},{"name":"B","number":26}]"
String filename = "export.csv";
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
ec.responseReset();
ec.setResponseContentType("text/comma-separated-values");
ec.setResponseHeader("Content-Disposition", "attachment; filename="" + filename + """);
OutputStream output = ec.getResponseOutputStream();
List<String> strings = new ArrayList<String>();
for (itemModel obj : objects) {
strings.add(obj.getName() + ";" + obj.getNumber() +"n");
}
for (String s : strings) {
output.write(s.getBytes());
}
fc.responseComplete();
现在,我想动态地向List中添加一个新字符串,并替换此行:strings.add(obj.getName() + ";" + obj.getNumber() +"n");
它应该更健壮。如果我不知道属性的确切名称,是否可以调用所有getter?
或者更好的解决方案是如何将JSON格式的字符串转换为字符串列表?
任何建议都将不胜感激!
您需要覆盖itemModel class中的toString()方法,并根据CSV for mt 构建字符串
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(name);
builder.append(";");
builder.append(number);
builder.append("n");
return builder.toString();
}
//最终写入
List<itemModel> itemModels = gson.fromJson(jsonString, collectionType);
for (itemModel itemModel : itemModels) {
output.write(itemModel.toString().getBytes());
}
如果您已经知道所有属性,那么实现ItemModel的toString()是很好的。
如果您还不了解所有属性,则可以使用"反射"来获取这些属性。