Как преобразовать строку в виде массива объектов в JSON в node.js - PullRequest
0 голосов
/ 09 мая 2020

Это моя строка

let data = "[{Date: 2002,Entity Taking Action: Maryland Board ,Action Taken: Reprimand},{Date: 2002,Entity Taking Action: Massachusetts Board,Action Taken: Consent order because of Maryland Board},{Date: 2007,Entity Taking Action: North Carolina Medical Board,Action Taken: Consent order because of Maryland Board action},{Date: 2013,Entity Taking Action: NC Medical Board,Action Taken: Letter of concern for not reporting previous NC consent order on reactivation of NC licence}]"

Ответы [ 2 ]

1 голос
/ 09 мая 2020
  1. Лучшее решение может заключаться в том, чтобы попросить поставщика этой строки не думать, что то, что он предоставляет, полезно. Существует высокая вероятность того, что это была небольшая ошибка или, по крайней мере, с очень небольшими усилиями с его стороны он может предоставить более структурированный формат (по крайней мере, напрямую yaml или что-то в этом роде)

  2. Если вы

    • Попробуйте преобразовать строку в jsonparsable

let data = "[{Date: 2002,Entity Taking Action: Maryland Board ,Action Taken: Reprimand},{Date: 2002,Entity Taking Action: Massachusetts Board,Action Taken: Consent order because of Maryland Board},{Date: 2007,Entity Taking Action: North Carolina Medical Board,Action Taken: Consent order because of Maryland Board action},{Date: 2013,Entity Taking Action: NC Medical Board,Action Taken: Letter of concern for not reporting previous NC consent order on reactivation of NC licence}]"
const t = data
  .replace(/([{,]\s*)([^{:]*)(:)/g, '$1"$2"$3') // replace keys
  .replace(/(:\s*)([^},]*)([,}])/g, (all, $1, $2, $3) => { // replace values
    let val = $2
    if (parseInt($2) != $2) {
      val = `"${$2}"`
    }
    return `${$1}${val}${$3}`
  }) // replace values
console.log('t : ', JSON.parse(t))
  • Или разобрать самостоятельно

let data = "[{Date: 2002,Entity Taking Action: Maryland Board ,Action Taken: Reprimand},{Date: 2002,Entity Taking Action: Massachusetts Board,Action Taken: Consent order because of Maryland Board},{Date: 2007,Entity Taking Action: North Carolina Medical Board,Action Taken: Consent order because of Maryland Board action},{Date: 2013,Entity Taking Action: NC Medical Board,Action Taken: Letter of concern for not reporting previous NC consent order on reactivation of NC licence}]"
const s = data.match(/{([^}]*)}/g).map(objStr => {
  const stripped = objStr.substring(1, objStr.length - 1)
  const o = stripped.split(',')
    .map(keyval => keyval.split(':'))
    .map(([k, v]) => {
      let val = parseInt(v)
      if (val != v) {
        val = v.trim()
      }
      return [k.trim(), val]
    })
  return Object.fromEntries(o)
})
console.log(s)

Но помните, что это только «попытки», потому что вы не знаете, какие странные вводные данные ваш провайдер может дать вам в будущем ...

0 голосов
/ 09 мая 2020

Вы можете анализировать свои странные входные данные с помощью ряда вложенных регулярных выражений, используя RegExp.exe c () и один String.split () .

  const data = "[{Date: 2002,Entity Taking Action: Maryland Board ,Action Taken: Reprimand},{Date: 2002,Entity Taking Action: Massachusetts Board,Action Taken: Consent order because of Maryland Board},{Date: 2007,Entity Taking Action: North Carolina Medical Board,Action Taken: Consent order because of Maryland Board action},{Date: 2013,Entity Taking Action: NC Medical Board,Action Taken: Letter of concern for not reporting previous NC consent order on reactivation of NC licence}]"
  const array = []
  console.log ('data', data);
  const regex1 = RegExp(/^\[(.*?)\]$/, 'g')
  while (true) {
    const rr1 = regex1.exec(data)
    if (!rr1) break
    const r1 = rr1[1]
    const regex2 = RegExp(/{(.+?)},?/, 'g')
    while (true) {
      let rr2 = regex2.exec(rr1)
      if (!rr2) break
      const r2 = rr2[1]
      const item = {}
      console.log('item', r2)
      const splits = r2.split(',')
      for (let key in splits) {
          let tagValue = splits[key]
          console.log ('tagValue', tagValue)
          const regex4 = RegExp(/ *(.+): *(.+) */, 'g')
          while (true) {
              const rr4=regex4.exec(tagValue)
              if (!rr4) break
              const tag = rr4[1]
              const val = rr4[2]
              item[tag] = val
              console.log ('field', tag, val)
          }
      }
      array.push(item)
      console.log ('item', item)
    }  
  }
  console.log(JSON.stringify(array))

Самый внешний RegExp(/^\[(.*?)\]$/, 'g') удаляет разделители [].

Следующий RegExp(/{(.+?)},?/, 'g') разбивает ваши {some thing},{another thing},{yet another} данные на some thing, another thing и yet another , удаляя при этом фигурные скобки {}.

String.split превращает вашу последовательность Tag: value, Tag: value в отдельные Tag: value элементы.

А самый внутренний RegExp(/ *(.+): *(.+) */, 'g') превращает эти в элементы tag и val.

Вы знаете, сказано, что если вы решите проблему с помощью регулярного выражения, у вас возникнут две проблемы. В этом решении используются три регулярных выражения, поэтому теперь у вас четыре проблемы. Дело в том, что синтаксический анализ регулярных выражений хрупок. Например, если в одном из ваших элементов Action Taken указано Disbarred, then thrown in federal prison, эта дополнительная запятая приведет к поломке этого парсера.

Вы можете написать надежный парсер для этого материала. Но лучше сообщить провайдеру свои данные, которые вам нужны реальные JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...