Este comportamiento es bastante molesto ya que las cadenas JSON se aceptan sin problemas cuando se usan como cadenas literales en los comandos SQL.
Ya existe un problema para esto en el repositorio Github del controlador de postgres (incluso si el problema parece ser el procesamiento del servidor).
Además de usar un molde (ver respuesta de @a_horse_with_no_name) en la cadena sql, el autor del problema ofrece dos soluciones adicionales:
- Usar un parámetro
stringtype=unspecified
en la URL/opciones de conexión de JDBC.
Esto le dice a PostgreSQL que todos los parámetros de texto o varchar son en realidad de tipo desconocido, lo que le permite inferir sus tipos más libremente.
- Envuelva el parámetro en un
org.postgresql.util.PGobject
:
PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(yourJsonString);
pstmt.setObject(11, jsonObject);