Ce comportement est assez ennuyeux car les chaînes JSON sont acceptées sans problème lorsqu'elles sont utilisées comme chaînes littérales dans les commandes SQL.
Il y a déjà un problème pour cela dans le référentiel Github du pilote postgres (même si le problème semble être le traitement côté serveur).
Outre l'utilisation d'un cast (voir la réponse de @a_horse_with_no_name) dans la chaîne sql, l'auteur du problème propose deux solutions supplémentaires :
- Utilisez un paramètre
stringtype=unspecified
dans l'URL/les options de connexion JDBC.
Cela indique à PostgreSQL que tous les paramètres text ou varchar sont en fait de type inconnu, ce qui lui permet de déduire leurs types plus librement.
- Enveloppez le paramètre dans un
org.postgresql.util.PGobject
:
PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(yourJsonString);
pstmt.setObject(11, jsonObject);