Usa il ->> operatore per recuperare il campo json.
Questo dovrebbe funzionare e restituire null (come in, nessun valore) correttamente per entrambi:
select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer
Ho fatto un violino che lo dimostra
PS:per ottenere la stringa "null" , dovresti definire il tuo json come:{"id": "null"}