如何从文本文件读取对象结构并赋值至List集合?
读取非标准JSON格式文本到List的解决方案
你的文本内容不是标准JSON格式(缺少数组包裹、对象间无分隔符),直接用split(",")会因为键值对换行分隔、对象间空行等问题无法正确解析,下面提供两种可行方案:
方案一:直接解析原始文本
步骤1:定义Patient实体类
先创建对应属性的实体类,处理可选字段(比如部分对象没有LastName):
public class Patient { private int ID; private String PatientNumber; private String Honorific; private String FirstName; private String LastName; private String DisplayName; private String Gender; private int DateOfBirth; private int Age; // 生成getter、setter方法,或使用Lombok简化 public int getID() { return ID; } public void setID(int ID) { this.ID = ID; } public String getPatientNumber() { return PatientNumber; } public void setPatientNumber(String patientNumber) { PatientNumber = patientNumber; } public String getHonorific() { return Honorific; } public void setHonorific(String honorific) { Honorific = honorific; } public String getFirstName() { return FirstName; } public void setFirstName(String firstName) { FirstName = firstName; } public String getLastName() { return LastName; } public void setLastName(String lastName) { LastName = lastName; } public String getDisplayName() { return DisplayName; } public void setDisplayName(String displayName) { DisplayName = displayName; } public String getGender() { return Gender; } public void setGender(String gender) { Gender = gender; } public int getDateOfBirth() { return DateOfBirth; } public void setDateOfBirth(int dateOfBirth) { DateOfBirth = dateOfBirth; } public int getAge() { return Age; } public void setAge(int age) { Age = age; } }
步骤2:读取并解析文本
通过分割空行获取单个患者块,再逐行解析键值对:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class PatientParser { public static void main(String[] args) { List<Patient> patientList = new ArrayList<>(); String filePath = "你的文件路径.txt"; try { // 读取全部文件内容 String content = new String(Files.readAllBytes(Paths.get(filePath))); // 按空行分割成单个患者的文本块(适配多个连续换行的情况) String[] patientBlocks = content.split("\\n\\s*\\n"); for (String block : patientBlocks) { Patient patient = new Patient(); // 按换行拆分每个键值对 String[] lines = block.split("\\n"); for (String line : lines) { line = line.trim().replaceAll("^\"|\"$", ""); // 去掉首尾引号和空格 String[] keyValue = line.split(":", 2); // 仅按第一个冒号拆分,避免值含冒号 if (keyValue.length != 2) continue; String key = keyValue[0].trim(); String value = keyValue[1].trim().replaceAll("^\"|\"$", ""); // 匹配键并赋值 switch (key) { case "ID": patient.setID(Integer.parseInt(value)); break; case "PatientNumber": patient.setPatientNumber(value); break; case "Honorific": patient.setHonorific(value); break; case "FirstName": patient.setFirstName(value); break; case "LastName": patient.setLastName(value); break; case "DisplayName": patient.setDisplayName(value); break; case "Gender": patient.setGender(value); break; case "DateOfBirth": patient.setDateOfBirth(Integer.parseInt(value)); break; case "Age": patient.setAge(Integer.parseInt(value)); break; } } patientList.add(patient); } // 输出验证结果 for (Patient p : patientList) { System.out.printf("ID: %d, 姓名: %s%n", p.getID(), p.getDisplayName()); } } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { System.err.println("数字格式错误:" + e.getMessage()); } } }
方案二:转换为标准JSON后解析
先手动或通过代码把原始文本转换成标准JSON格式(添加数组包裹、对象间逗号):
[ { "ID": 1, "PatientNumber": "12", "Honorific": "Mrs.", "FirstName": "Abc", "DisplayName": "Abc", "Gender": "Female", "DateOfBirth": 41881, "Age": 0 }, { "ID": 2, "PatientNumber": "123", "Honorific": "Mrs.", "FirstName": "xyz", "LastName": "xyz", "DisplayName": "xyz", "Gender": "Female", "DateOfBirth": 41881, "Age": 0 } ]
然后用Jackson或Gson等JSON库快速解析:
使用Jackson的示例代码
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; import java.util.List; public class JsonParser { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); String filePath = "转换后的JSON文件路径.json"; try { List<Patient> patientList = mapper.readValue( new File(filePath), mapper.getTypeFactory().constructCollectionType(List.class, Patient.class) ); for (Patient p : patientList) { System.out.printf("ID: %d, 姓名: %s%n", p.getID(), p.getDisplayName()); } } catch (IOException e) { e.printStackTrace(); } } }
Maven依赖(Jackson)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
内容的提问来源于stack exchange,提问作者Muttalli
相关产品推荐
相关产品推荐

