Utilisez le ->> opérateur pour récupérer le champ json.
Cela devrait fonctionner et renvoyer null (comme dans, pas de valeur) correctement pour les deux :
select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer
J'ai fabriqué un violon qui le démontre
PS :pour obtenir la chaîne "null" , vous devez définir votre json comme :{"id": "null"}