разбить строковое сообщение на массив в Typescript

#javascript #arrays #json #typescript

#javascript #массивы #json #typescript

Вопрос:

Я пытаюсь разбить строковое сообщение на массив в Typescript. Я не могу использовать запятую, так как есть строка json. Я попытался проанализировать, но получаю сообщение об ошибке.

 const msgs = 'string_no_quotes,"string-with@}-weirdchars",{"ckey":null,"email":"user@gmail.com","pass":"password","name":{"firstName":"User","middleName":"","lastName":"Name"},"address":{"street": "test street", "country":"some country", "zip": "639821"},"status":1},opt-data'

const messages:string[] = JSON.parse(msgs.toString())
  

Ошибка :

 SyntaxError: Unexpected token c in JSON at position 1
    at JSON.parse (<anonymous>)
  

Что может быть лучшим решением для получения значений в строковом массиве.

PS: Если вам интересно, почему я придумал такую неприятную строку, это сообщение ‘ZeroMQ’. И я попытался,

 JSON.parse("[" msgs.toString() "]")
eval("(" msgs.toString() ")")
  

Комментарии:

1. Привет, Космо. Как вы хотите, чтобы выглядела окончательная структура данных?

2. Используемая вами строка не является допустимым JSON (это даже не допустимая строка JS / TS), поэтому я думаю, что лучшее решение — передать ее в допустимом формате JSON. В противном случае вам нужно будет написать пользовательский синтаксический анализатор для просмотра строки и всякий раз, когда он встречает запятую, чтобы определить, что будет дальше, и прочитать это соответствующим образом.

3. Ваша первая строка кода недопустима. У вас есть строка 'string_no_quotes,"string-withQuotes",' , а затем объект {"ckey"...

4. массив строковых объектов [«string_no_quotes», «string-withQutoes», «{/*JSON string*/}», «opt-data»]. Я понимаю, что JSON.parse пытается проанализировать строку как объект, но я хочу, чтобы этот объект внутри массива предпочтительно анализировался. Спасибо jburtondev

5. Возможно ли вообще, что вы могли бы изменить источник данных, чтобы вместо этого отправлять правильно отформатированный JSON? Это почти наверняка было бы проще, чем иметь дело с этим.

Ответ №1:

Понял это с помощью пользовательской функции после долгих попыток, не прямолинейно, но работает по мере необходимости. Первоначальная проблема заключалась в том, что входные данные поступают в виде буфера от брокера zmq, и есть этот странный формат данных из msg.toString()

Шаги:

  1. Используется регулярное выражение для разделения данных объекта,

  2. замените совпадение регулярных выражений на строку шаблона,

  3. разделите его, замените созданный массив и верните его.

      export const parseTheCrapOutOfThatDamnString = (paramString: string) => {
       const regEx = RegExp("(?<={)(.*)(?=})") //(?<={)(.*)(?=})  //https://regexr.com/2tr5t
       if(regEx.test(paramString)) { 
         var theMatch:string = `${_.head(paramString.match(regEx))}` || "" //;console.log(`n${theMatch}n`)
         var paramsArray = _.replace(paramString, theMatch, "replaceable").split(',') //;console.log(paramString)
         paramsArray[paramsArray.indexOf('{replaceable}')] = JSON.parse(`{${theMatch}}`)
         return paramsArray;
       }else { 
         return JSON.parse("[" paramString "]")
       }
     }
      

вызов,

   const msgs = 'string_no_quotes,"string-with@}-weirdchars",{"ckey":null,"email":"user@gmail.com","pass":"password","name":{"firstName":"User","middleName":"","lastName":"Name"},"address":{"street": "test street", "country":"some country", "zip": "639821"},"status":1},opt-data'
  console.log(parseTheCrapOutOfThatDamnString(msgs))
  

конечный результат:

 ["string_no_quotes", "string-with@}-weirdchars", {
  "ckey": null,
  "email": "user@gmail.com",
  "pass": "password",
  "name": {
    "firstName": "User",
    "middleName": "",
    "lastName": "Name"
  },
  "address": {
    "street": "test street",
    "country": "some country",
    "zip": "639821"
  },
  "status": 1
}, "opt-data"]
  

вот это Typescript play