Usa el ->>
operador para recuperar el campo json.
Esto debería funcionar y devolver null
(como en, sin valor) correctamente para ambos:
select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer
He hecho un violín eso lo demuestra
PD:para obtener la cadena "null"
, necesitaría definir su json como:{"id": "null"}