Изменение
$user->setRoles(array('{"0": "ROLE_USER"}'));
Для
$user->setRoles(["ROLE_USER"]);
Это сделает работу.
Ваше объявление массива неверно. Вы помещаете один элемент в массив, и элемент выглядит так: {"0": "ROLE_USER"}
в виде простой строки.
Для столбца доктрины "json" вам не нужно самим json_encode или json_decode. Доктрина справится с этим за вас!
Поток:
1) Вы даете Доктрине массив
2) Doctrine будет json_encode вашего массива и сохранить его в столбце как json_data
3) Если вы запросите значение столбца, doctrine будет json_decode для вашего массива, чтобы вы могли снова работать с ним.
Ваша желаемая цель также неверна.
Вы хотите json_data, как это:
{"0": "ROLE_USER"}
Но я думаю, у вас будут такие данные:
{"ROLE_USER"}
Но в обоих случаях используется один и тот же массив:
array {
0 => ROLE_USER
}