Mysql 5.7 introdujo el tipo de datos JSON que ofrece toneladas de funciones de consulta.
Dado que no hay una función de conjunto de resultados compatible, cómo y qué debo usar para recuperar los datos almacenados en este tipo de datos.
Debería ser rs.getString , porque getString se usa con VARCHAR , TEXT , podemos considerar a JSon como un tipo String , para que pueda obtener el resultado usando getString .
Ejemplo sencillo
Verifique dos veces con MySQL 5.7 y PostgreSQL 9.4:
MySQL 5.7 SQL
create database db_test; create table table_test(json JSON); INSERT INTO table_test VALUES('{"key1": "value1", "key2": "value2"}');CÓDIGO
public static void checkJSon() { try { Class.forName(DRIVER); Connection connection = DriverManager.getConnection(DB_URL, DB_username, DB_password); String q = "SELECT * FROM table_test"; PreparedStatement preparedStatement = connection.prepareStatement(q); preparedStatement.execute(); ResultSet rs = preparedStatement.executeQuery(); while (rs.next()) { System.out.println(rs.getString("json")); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } }Me imprime:
{"key1": "value1", "key2": "value2"}En caso de que JDBC no sea un requisito estricto, las versiones recientes de jOOQ implementaron una forma lista para usar de asignar valores SQL JSON a tipos arbitrarios de Java utilizando las populares bibliotecas de asignación de JSON Jackson o gson (cualquiera que se pueda encontrar en su classpath) . A continuación, puede escribir:
List<MyClass> list = ctx.select(TABLE.ID, TABLE.JSON_COLUMN) .from(TABLE) .where(...) .fetchInto(MyClass.class);Con, por ejemplo:
public class MyClass { public int id; public MyOtherClass jsonColumn; } public class MyOtherClass { public String something; public List<String> list; } Suponiendo que su JSON_COLUMN contiene datos de la forma:
{ "something": "x", "list": [ "a", "b", "c" ] }Esto también funciona con todas las funciones SQL/JSON admitidas de forma nativa, para crear dichos documentos JSON sobre la marcha .
(Descargo de responsabilidad: trabajo para la empresa detrás de jOOQ)
En caso de que alguien todavía esté buscando, lo estaba probando con Mysql 5.7, pero los métodos sugeridos anteriormente no manejan muy bien los datos que no son ascii, muchos caracteres asiáticos, etc.). Terminan mostrándose distorsionados.
La solución es leer los bytes sin procesar usando getBinaryStream. El código se demuestra a continuación:
public String fromJSON(ResultSet rs, String fieldName){ InputStream is = rs.getBinaryStream(fieldName); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String content = br.lines().reduce("", String::concat); br.close(); return content; }Lo anterior podría encapsularse en una función de JSON y usarse ampliamente. p.ej
PreparedStatement st = getStatement("select json from x;"); ResultSet rs = st.executeQuery(); while (rs.next()) { return fromJSON(rs, "json"); }