Esse comportamento é bastante irritante, pois as strings JSON são aceitas sem problemas quando usadas como strings literais em comandos SQL.
Já existe um problema para isso no repositório Github do driver postgres (mesmo que o problema pareça ser o processamento do lado do servidor).
Além de usar um cast (veja a resposta de@a_horse_with_no_name) na string sql, o autor do problema oferece duas soluções adicionais:
- Use um parâmetro
stringtype=unspecified
na URL/opções de conexão JDBC.
Isso informa ao PostgreSQL que todos os parâmetros text ou varchar são, na verdade, de tipo desconhecido, permitindo que ele indique seus tipos mais livremente.
- Enrole o parâmetro em um
org.postgresql.util.PGobject
:
PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(yourJsonString);
pstmt.setObject(11, jsonObject);