【问题标题】:Convert String in JSON format into CSV / List of Strings将 JSON 格式的字符串转换为 CSV / 字符串列表
【发布时间】:2014-04-15 12:53:46
【问题描述】:

我创建了一个 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();

现在,我想动态地将新字符串添加到列表中并替换此行:strings.add(obj.getName() + ";" + obj.getNumber() +"\n"); 它应该更健壮。如果我不知道确切的属性名称,是否可以调用所有 getter?

或者更好的解决方案如何将JSON格式的字符串转换为字符串列表?

任何建议将不胜感激!

【问题讨论】:

  • 试试这个链接stackoverflow.com/questions/8724866/…。我希望这会对你有所帮助。
  • 感谢您的推荐,但我认为没有可能的解决方案。我需要动态调用对象类的所有 getter.. 或找到另一个更好的解决方案。

标签: java json jsf csv jsf-2


【解决方案1】:

您需要重写 itemModel 类中的 toString() 方法并根据 CSV 格式构建您的字符串

@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());
        }

【讨论】:

  • 绝对精彩!它可能永远也想不通。
【解决方案2】:

如果你已经知道所有的属性,那么实现 ItemModel 的 toString() 是很好的。

如果您还不知道所有属性,您可以使用反射来获取它们。

【讨论】:

  • 感谢您的推荐!我试图实现反射,但我没有解决如何在循环内调用找到的吸气剂 for (itemModel obj : objects) { } 但 toString() 对我来说仍然足够。
猜你喜欢
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2020-09-09
  • 1970-01-01
  • 2018-08-04
  • 2020-01-03
相关资源
最近更新 更多