You can certainly use JSON, and in some cases it might be preferable. For example, I store different server configs in JSON because it's easier, but I only have 3 rows (1 for each environment - local, staging, production) and only ever need to retrieve 1 row. Each row has the environment name as a separate column so it's easy to look up. I don't need to find out if a specific config contains a specific setting - I'm retrieving the entire contents of the row and then loading the config into a local state store as-is.
For any table where you need to find data based on a specific field, individual columns are better. For example, if you wanted to find all houses which have a pool but also have more than 3 bedrooms, it would take Postgres much longer to find results matching that data if it's stored as JSON than it would if each property had it's own column.
Storing everything as JSON is where NoSQL like Mongo or Firebase are better, and Postgres/Supabase isn't really built around being really effective at that.