Явный подход, основанный на разборе входных объектов с Object.entries и Array.prototype.map :
const inputData = { "id": 2, "name": "{John}" };
const parsed = `[` +
Object.entries(inputData)
.map(v =>
`"${v[0]}": ` +
(typeof v[1] === `string` ? `"${v[1]}"` : v[1])
)
.join(`, `) +
`]`;
console.log(parsed); // ["id": 2, "name": "{John}"]
Для обработки вложенных объектов процедуру можно запускать рекурсивно с дополнительной веткой синтаксического анализа:
const inputData = { "id": 2, "name": "{John}", "foo": { "bar": "{zoo}" } };
const parse = (data) => `[` +
Object.entries(data)
.map(v =>
`"${v[0]}": ` + (
typeof v[1] === `string`
? `"${v[1]}"`
: (
typeof v[1] === "object"
? parse(v[1])
: v[1]
)
)
)
.join(`, `) +
`]`;
console.log(parse(inputData));
// ["id": 2, "name": "{John}", "foo": ["bar": "{zoo}"]]
Вложенные массивы также можно обрабатывать аналогичным образом, просто нужно добавить еще 1 ветвь условия.