import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class NestedJsonArrayToObjectListTypeHandler extends BaseTypeHandler<List<Object>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<Object> parameter, JdbcType jdbcType) throws SQLException {
try {
String json = objectMapper.writeValueAsString(parameter);
ps.setString(i, json);
} catch (JsonProcessingException e) {
throw new SQLException("Error converting list to JSON", e);
}
}
@Override
public List<Object> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return jsonStringToList(rs.getString(columnName));
}
@Override
public List<Object> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return jsonStringToList(rs.getString(columnIndex));
}
@Override
public List<Object> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return jsonStringToList(cs.getString(columnIndex));
}
private List<Object> jsonStringToList(String json) throws SQLException {
if (json == null || json.isEmpty()) {
return new ArrayList<>();
}
try {
return parseJsonArray(json);
} catch (JsonProcessingException e) {
throw new SQLException("Error converting JSON to list", e);
}
}
private List<Object> parseJsonArray(String jsonArray) throws JsonProcessingException {
List<Object> result = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
List<Object> list = mapper.readValue(jsonArray, List.class);
for (Object obj : list) {
if (obj instanceof List) {
result.add(parseJsonArray(mapper.writeValueAsString(obj)));
} else {
result.add(obj);
}
}
return result;
}
}
无论 JSON 数组中的元素是空对象、字符串、数字、布尔值还是其他类型,都可以成功地转换为 List,因为它可以容纳任意类型的对象。