Вы должны получить его как JSON из postgres с row_to_json()
, json_agg
и / или array_to_json()
.См. Эту документацию о Агрегатных функциях
select array_to_json(array_agg(row_to_json(t)))
from (
select id, text from words
) t
Или ваш список должен быть строкой, поскольку он недопустим. JS.
`${yourQueryData}`
Если ввод должен быть таким, как упомянуто в вопросе, поэтому строка (скажем, из txt-ввода или что-то еще) вот что мы можем сделать.
Мы добавим скобки вокруг этой строки, чтобы получитьначалось.
Затем мы идентифицируем каждый аспект, который не будет действительным, когда мы анализируем его для данных JSON.
- Добавить запятые между объектами:
}{
в },{
- Получить ключи и добавить кавычки вокруг них:
user_id:
в "user_id":
- Заменитьодинарные кавычки двойными кавычками:
'Alice'
становится "Alice"
- Ваши метки времени должны быть преобразованы в строки:
2018-11-23T20:47:39.618Z
в "2018-11-23T20:47:39.618Z"
Как только все это будет исправлено, мыиспользуйте JSON.parse()
и там у вас есть массив объектов JSON.
Есть много способов добраться туда.Вы можете разбить вашу строку в нескольких местах, затем выполнить итерацию и выполнить необходимые задачи.
Здесь я буду использовать регулярное выражение.Для ясности, каждый шаг достаточно четкий, даже в регулярных выражениях содержится гораздо больше групп, чем необходимо, но я надеюсь, что это облегчает понимание как есть.
Этот ответ основан именно на коде, который вы предоставили,Но это потребует некоторых модификаций, если, например, name
содержит одну кавычку.
const list = `
{ user_id: 1,
name: 'Alice',
created_at: 2018-11-23T20:47:39.618Z,
count: '3' }
{ user_id: 4,
name: 'Daphne',
created_at: 2018-11-19T21:47:39.618Z,
count: '3' }
{ user_id: 2,
name: 'Bob',
created_at: 2018-11-23T18:47:39.618Z,
count: '2' }
{ user_id: 5,
name: 'Evan',
created_at: 2018-11-18T19:47:39.618Z,
count: '2' }
{ user_id: 6,
name: 'Fabia',
created_at: 2018-11-22T23:47:39.618Z,
count: '2' }
`
// Add brackets around the list to have the string representation of an array
const array = `[${list}]` // wrap into array
// 1. Add commas between objects: `}{` to `},{`
const regex = /\}[\r\n|\r|\n]?\{/gm // match closing followed by opening bracket
const fixObjects = array.replace(regex, "},\n{") // add comma at the end of each object
// 2. Get the keys and add quotes around them: `user_id:` to `"user_id":`
const keysReg = /^(?:[\s|\{]+)([\w]+)(?:\:)/gm // get keys
const fixKeys = fixObjects.replace(keysReg, function(match, g1) { return match.replace(g1, `"${g1}"`) }); // wrap keys in quotes
// 3. Replace single quotes by double quotes: `'Alice'` becomes `"Alice"`
const quotesReg = /'(.*)'/gm // match between single quotes
const fixQuotes = fixKeys.replace(quotesReg, function(match, g1) { return `"${g1}"` })
// 4. Your timestamps must be converted to strings: `2018-11-23T20:47:39.618Z` to `"2018-11-23T20:47:39.618Z"`
const datesReg = /(\d{4})\-(\d{2})\-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z/gm // timestamps as strings
const fixDates = fixQuotes.replace(datesReg, function(match) { return `"${match}"` } )
console.log(JSON.parse(fixDates))