every time i need to add a nickname- this happens a lot.
OK...
so i want to put everything in an array or json.
Those are not the only two solutions...
remember rows can have different number of nicknames.
Which is why you setup a "one-to-many (optional)" relationship between two tables; the first table's row (i.e., person) can have many related rows (i.e., nicknames) on the second table.
Each nickname a person has is represented by a single row on the "person-nickname" table with whatever attributes you wish to keep track of. New nickname means you add a new row - just like you would add a new array item to your JSON model.
If you need a truly dynamic representation (i.e, you do not know what nickname attributes you want to keep track of - like visibility and order as already shown - or want to allow users to add their own) you'd have to go with JSON (or add an hstore column to the nickname table); the array will not get you want you need
because multi-dimensional arrays are not a solution.
The solution proposed solves the "variable number of nicknames per person" need that you describe. If there are other constraints you are dealing with you need to list them.