one field with a json array is definitely worse…
your way is okay, but still not the best…
best is a separate table, called project_users, which has one row per contributor or author
CREATE TABLE project_users
( project_id INTEGER NOT NULL
, CONSTRAINT project_users_project
FOREIGN KEY ( project_id )
REFERENCES projects ( id )
, user_id INTEGER NOT NULL
, CONSTRAINT project_users_user
FOREIGN KEY ( user_id )
REFERENCES users ( id )
, PRIMARY KEY ( project_id , user_id )
, INDEX user_projects ( user_id , project_id )
, role CHAR(1) NOT NULL
/* C = contributor
A = author */
);