You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从文本文件读取对象结构并赋值至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:50:34