Użyj ->> operator do pobierania pola json.
To powinno działać i zwrócić null (jak w, bez wartości) poprawnie dla obu:
select ('{"id": null}'::json->>'id')::text
select ('{"id": null}'::json->>'id')::integer
Mam skrzypce co to demonstruje
PS:aby uzyskać ciąg "null" , musisz zdefiniować swój json jako:{"id": "null"}