currently JSON support NULL value - but we doesn't convert NULL to JSON correctly
postgres=# select to_json(NULL::text) IS NULL; ┌──────────┐ │ ?column? │ ╞══════════╡ │ t │ └──────────┘ (1 row)
probably should be json "null";
like
postgres=# select json 'null' is null; ┌──────────┐ │ ?column? │ ╞══════════╡ │ f │ └──────────┘ (1 row)
I agree that for correctness reasons it should, but just don't think it would be OK to change this behavior -- the function was there since 9.3...
Given there were no loud complaints about this, the current behavior is appropriate for most users, the rest can still work around using coalesce(to_json(...), json 'null').