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

如何通过RowMapper从PostgreSQL查询结果生成Person类的habits列表?

解析PostgreSQL查询结果中的JSON数组为Java List

你的habits列返回的是JSON格式字符串(比如["walking", "eating"]),需要通过JSON解析库将其转换为List<String>,以下是两种常用实现方式:

方法一:使用Jackson(Spring生态常用)

Jackson是Spring默认集成的JSON处理库,直接用它解析JSON字符串到List:

  1. 先声明单例ObjectMapper(避免重复创建实例消耗资源):
private final ObjectMapper objectMapper = new ObjectMapper();
  1. 补全RowMapper实现,添加JSON解析逻辑:
private final RowMapper<Person> rowMapper = (rs, rowNum) -> {
    String firstName = rs.getString("name");
    String lastName = rs.getString("lastName");
    String habitsJson = rs.getString("habits");

    List<String> habits = null;
    if (habitsJson != null && !habitsJson.isBlank()) {
        try {
            // 用TypeReference指定泛型类型,规避类型擦除问题
            habits = objectMapper.readValue(habitsJson, new TypeReference<List<String>>() {});
        } catch (IOException e) {
            // 将JSON解析异常包装为SQLException,符合RowMapper的异常抛出规范
            throw new SQLException("解析habits JSON失败", e);
        }
    }

    Person person = new Person();
    person.setFirstName(firstName);
    person.setLastName(lastName);
    person.setHabits(habits);
    return person;
};
  1. 确保项目依赖包含Jackson:
    如果是Maven项目,添加以下依赖(使用最新稳定版本):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

方法二:使用Gson

如果项目中使用Gson,可采用类似逻辑解析:

  1. 声明单例Gson实例:
private final Gson gson = new Gson();
  1. 修改解析逻辑:
private final RowMapper<Person> rowMapper = (rs, rowNum) -> {
    String firstName = rs.getString("name");
    String lastName = rs.getString("lastName");
    String habitsJson = rs.getString("habits");

    List<String> habits = null;
    if (habitsJson != null && !habitsJson.isBlank()) {
        habits = gson.fromJson(habitsJson, new TypeToken<List<String>>(){}.getType());
    }

    Person person = new Person();
    person.setFirstName(firstName);
    person.setLastName(lastName);
    person.setHabits(habits);
    return person;
};

特殊情况:如果habits是PostgreSQL原生数组类型(TEXT[])

如果你的habits列是PostgreSQL原生数组类型(而非JSON),可直接用JDBC的getArray方法处理:

private final RowMapper<Person> rowMapper = (rs, rowNum) -> {
    String firstName = rs.getString("name");
    String lastName = rs.getString("lastName");
    Array habitsArray = rs.getArray("habits");

    List<String> habits = null;
    if (habitsArray != null) {
        String[] habitsArr = (String[]) habitsArray.getArray();
        habits = Arrays.asList(habitsArr);
        // 若需要可修改的List,替换为new ArrayList<>(Arrays.asList(habitsArr))
    }

    Person person = new Person();
    person.setFirstName(firstName);
    person.setLastName(lastName);
    person.setHabits(habits);
    return person;
};

内容的提问来源于stack exchange,提问作者Vasek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:10:13