将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
相关产品推荐
相关产品推荐

