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

将ResultSet数据存入List<Object>后JSON格式化异常的解决办法

解决ResultSet数据存入List后的JSON格式化异常问题
  • 检查ResultSet返回的对象类型
    你用resultSet.getObject(1)拿到的可能是JDBC驱动专属的类型(比如SQLXML、自定义SQL数据类型),这类类型默认JSON序列化器无法处理。单行返回时框架可能做了隐式转换,但存入集合后不会触发这个逻辑。建议直接用对应类型的get方法转换,比如字符串用getString(1)、日期用getTimestamp(1)转成LocalDateTime,代码示例:
ResultSet resultSet = stmt.executeQuery(sql);
List<String> res = new ArrayList<>();
while(resultSet.next()){
  res.add(resultSet.getString(1));
}
return res;
  • 自定义JSON序列化规则(必须保留Object类型时)
    如果没法提前确定返回类型,给JSON序列化器加针对JDBC特殊类型的处理逻辑。比如用Jackson的话,注册JDBC模块:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JdbcModule());

也可以写自定义序列化器,把未知Object转成通用可序列化的格式:

public class GenericObjectSerializer extends StdSerializer<Object> {
    public GenericObjectSerializer() {
        super(Object.class);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (value instanceof SQLXML) {
            gen.writeString(((SQLXML) value).getString());
        } else if (value instanceof java.sql.Date) {
            gen.writeString(((java.sql.Date) value).toLocalDate().toString());
        } else {
            gen.writeString(value.toString());
        }
    }
}

注册到ObjectMapper:

mapper.registerModule(new SimpleModule().addSerializer(new GenericObjectSerializer()));
  • 规避泛型类型擦除问题
    Java泛型的类型擦除会让序列化器无法识别List元素的实际类型,尽量用带具体泛型的集合,比如List<Map<String, Object>>来包装元素:
List<Map<String, Object>> res = new ArrayList<>();
while(resultSet.next()){
    Map<String, Object> row = new HashMap<>();
    row.put("data", resultSet.getObject(1));
    res.add(row);
}
return res;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:54:22