On Postgresql there is a
Assuming you're talking about actual, strict JSON (without quirks such as unquoted keys)...
json isn't too different from
text. It doesn't do much apart from validating JSON.
jsonb is a different beast compared to the these two: it's a full-fledged data structure with its own internal format that has much more operations available in searches. For instance
json has no applicable
= (equality operator).
jsonb has. (
text has too, even though it's semantically different.)
It's much more sensible to index, but it has to be transformed back and forth during reads and writes.
jsonb doesn't look like a sound choice here.
... So there is only one decision left to make:
Do you want to ensure that your database contains only valid JSON values in your column? On the database level? Or do you trust every client of that database (server apps, typically) to only supply valid data?
json is a relatively safe choice either way. Using
text could theoretically improve performance by a negligible margin due to absence of validation, but you'll only get specific numbers by benchmarking. But it wouln't have that safeguard against non-JSON values, and an accidental bug in the client could go unnoticed. Test responsibly!