Здесь я вижу разные решения, от ужасно грязных до "ну, ничего страшного"
все решения, которые не очень грязные (например, замена строк скобками и прочее), все работают с нормализованным массивом:
$array = $serializer->normalize($person);
/** add code, that turns $array into flattened version $flattened */
$json = $serializer->encode($flattened, 'json');
Теперь, что это за код, который выравнивает массив ... например, вот так:
// if this is done in a loop, this, $flattened should be reinitialized every iteration!!!
$flattened = [];
array_walk_recursive($array, function($value, $key) use (&$flattened) {
$target[$key] = $value;
});
// $flattened contains the flattened array
немного более длинная версия:
// define somewhere outside of loop
function flatten($array, $flattened = []) {
foreach($array as $key => $value) {
if(is_array($value)) {
$flattened = flatten($value, $flattened);
} else {
$flattened[$key] = $value;
}
}
return $flattened;
}
// call flatten
$flattened = flatten($array);
очень интересным решением было бы интегрировать все это в ваш пользовательский кодер, который расширяет кодер json, но я думаю, это уже излишне.
также обратите внимание, что это может и не получится во многих случаях,поскольку ключи могут быть переопределены, его нельзя применять к массивам объектов без итерации по ним, это может привести к нежелательным результатам для вложенных объектов и т. д.