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"}