如何从TSV转换的含ArrayList的JSONArray提取元素并逐一赋值给String
解决方案
核心问题分析
你之前的代码做了无意义的冗余操作:已经把TSV解析成结构化的List<List<String>> records了,却转成JSON字符串去处理——字符串是无结构的,自然没法直接提取单个元素。直接操作原始的List集合才是最高效、最直接的方式。
实现方式一:直接提取并输出目标格式
假设你的TSV里从第二行(对应records的索引1)开始是有效数据,每一行的第0个元素是ID、第1个是text、第2个是count,直接遍历records即可:
List<List<String>> records = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(content))) { String line; while ((line = br.readLine()) != null) { String[] values = line.split("\t"); // 注意用转义字符\t表示制表符,而非原始制表符 records.add(Arrays.asList(values)); } // 按要求格式输出 System.out.println("DataExtract = {"); // 跳过表头(如果第一行是表头,从索引1开始遍历数据行) for (int i = 1; i < records.size(); i++) { List<String> row = records.get(i); String id = row.get(0); String text = row.get(1); String count = row.get(2); System.out.printf("ID : %s,\ntext = \"%s\"\ncount = %s ,\n\n", id, text, count); } System.out.println("}"); } catch (IOException e) { e.printStackTrace(); }
实现方式二:用POJO封装数据存入ArrayList(更规范)
如果后续还要对这些数据做业务操作,建议定义实体类封装数据,再存入ArrayList,比直接操作二维List更清晰易维护:
- 定义实体类:
class DataItem { private String id; private String text; private int count; // 构造方法 public DataItem(String id, String text, int count) { this.id = id; this.text = text; this.count = count; } // 按需添加Getter/Setter public String getId() { return id; } public String getText() { return text; } public int getCount() { return count; } }
- 解析并存储:
List<List<String>> records = new ArrayList<>(); List<DataItem> dataList = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(content))) { String line; while ((line = br.readLine()) != null) { String[] values = line.split("\t"); records.add(Arrays.asList(values)); } // 封装数据到ArrayList<DataItem> for (int i = 1; i < records.size(); i++) { List<String> row = records.get(i); String id = row.get(0); String text = row.get(1); int count = Integer.parseInt(row.get(2)); // 转成int类型,匹配需求里的数字count dataList.add(new DataItem(id, text, count)); } // 遍历输出目标格式 System.out.println("DataExtract = {"); for (DataItem item : dataList) { System.out.printf("ID : %s,\ntext = \"%s\"\ncount = %d ,\n\n", item.getId(), item.getText(), item.getCount()); } System.out.println("}"); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { System.err.println("count字段不是有效数字:" + e.getMessage()); }
注意事项
- 替换
split(" ")为split("\t"),Java中需用转义字符表示制表符; - 如果TSV存在空值(比如text为空),
row.get(1)会直接返回空字符串,符合需求格式; - 若count是数字类型,务必做类型转换,避免字符串存储带来的后续问题。
内容的提问来源于stack exchange,提问作者nikom
相关产品推荐
相关产品推荐

