2017-02-21 6 views
0

Очень новое для node.js, у меня есть строка, возвращающаяся из RPGLE (as400), я хотел бы вернуться в качестве примера JSON ниже.Преобразование String в JSON node.js

Строка

{orderid:996553,workorder:996553.010,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:996554,workorder:996554.010,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:999290,workorder:999290.010,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:999290,workorder:999290.020,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:999290,workorder:999290.030,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:999290,workorder:999290.040,shipped:000000001,received:000000001,status:GOOD}, 
{orderid:999290,workorder:999290.050,shipped:000000001,received:000000001,status:GOOD}, 

хотели бы конвертировать, как показано ниже, и отправить приложения апи

[{"orderid":144234,"workorder":"996553.010","shipped":1,"received":1,"status":"GOOD"}, 
{"orderid":999290,"workorder":"996553.010","shipped":1,"received":1,"status":"GOOD"}, 
{"orderid":999290,"workorder":"999290.010","shipped":1,"received":1,"status":"GOOD"}, 
{"orderid":999290,"workorder":"999290.020","shipped":1,"received":1,"status":"BAD"}, 
{"orderid":999290,"workorder":"999290.030","shipped":1,"received":1,"status":"GOOD"}, 
{"orderid":999290,"workorder":"999290.040","shipped":1,"received":1,"status":"GOOD"}, 
{"orderid":999290,"workorder":"999290.050","shipped":1,"received":1,"status":"GOOD"}] 

Что бы лучшей практикой и каким образом?

+0

Итак, у вас есть строка, и вы хотели бы преобразовать ее в строку? Я думаю, что это не проблема с JSON прямо здесь. Просто добавьте «[]», и все готово. – NikxDa

+1

@NikxDa Я согласен с этой мыслью, но это немного больше, чем просто добавление '[]' и вызов ее. Ключи и значения должны быть завернуты в кавычки, а также для правильного анализа в конце. –

+0

Правда, я этого не замечал. – NikxDa

ответ

2

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

var meh = "{orderid:996553,workorder:996553.010,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:996554,workorder:996554.010,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:999290,workorder:999290.010,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:999290,workorder:999290.020,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:999290,workorder:999290.030,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:999290,workorder:999290.040,shipped:000000001,received:000000001,status:GOOD},\ 
 
{orderid:999290,workorder:999290.050,shipped:000000001,received:000000001,status:GOOD},"; 
 

 
meh = "[" +           // enclose with [] 
 
    meh.replace(/(\w+)(?=:)/g, '"$1"')    // search for words followed by a colon 
 
    .replace(/,$/, '')        // trim the ending comma 
 
    .replace(/:([\w.]+)/g, function(match, value){ // grab the values 
 
     return ':' + (        // ensure preceding colon is in place 
 
     isNaN(value) || value % 1 !== 0 ?   // is it a non-float number? 
 
      '"' + value + '"' :      // enclose with "" if not a non-float number 
 
      parseFloat(value)       // parse if is number 
 
    ); 
 
    }) 
 
    + "]";           // enclose with [] 
 

 
console.log(JSON.parse(meh));

+0

, который сделал трюк, спасибо, можете ли вы подробно объяснить эту строку, пожалуйста, meh.replace (/ (\ w +) (? =:)/G , '' $ 1 "')'. Работает отлично – Nick

+0

Когда строка возвращает из RPGLE, получена À в начале строки, поэтому просто нужна подстрока, так как ничего не найдено в RPGLE программе OUTPUT, но когда строка отображения, хотя node.js, получила À. очень странно – Nick

+1

@Nick '.replace (/ (\ w +) (? =:)/g, '" $ 1 "')'. Во-первых, регулярное выражение '/ (\ w +) (? =:)/g'. '\ w' означает« символ слова ». Технически это класс символов' [a-zA-Z0-9_] ', поэтому любой из этих символов для 1 или более символов (представленный' + '. Это похоже на' * ', но вместо 0 или более, это 1 или более). Это записывается в группу захвата с использованием' (...) '.' (? = :) '- это lookahead, представленный' (? =. ..) '. Он« смотрит в будущее »для одного символа двоеточия. Шаблон соответствует любому слову, за которым следует двоеточие. ly Он заменяет нашу захваченную группу самой собой, заключенной в кавычки ('' "$ 1" ''). –

2

можно разобрать строки в допустимый яваскрипте объектов, а затем stringify их в формат JSON как это:

const s = ` 
 
{orderid:996553,workorder:996553.010,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:996554,workorder:996554.010,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:999290,workorder:999290.010,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:999290,workorder:999290.020,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:999290,workorder:999290.030,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:999290,workorder:999290.040,shipped:000000001,received:000000001,status:GOOD}, 
 
{orderid:999290,workorder:999290.050,shipped:000000001,received:000000001,status:GOOD}, 
 
`; 
 

 
const array = s.trim().split("\n").map((line) => 
 
    line 
 
    .slice(1, -2) // remove brackets and comma 
 
    .split(",") // break into individual key/value pairs 
 
    .map((pair) => pair.split(":")) // split key/value pairs 
 
    .reduce((result, [key, value]) => { // reduce pairs into an object 
 
     result[key] = value; 
 
     return result; 
 
    },{}) 
 
); 
 

 
const json = JSON.stringify(array, null, 2); 
 

 
console.log(json);

+0

за вашу помощь, но мы приняли ответную работу. Пробовал ваше предложение, но он возвращал API как «text/plain», а приложение, которое читает API, не понравилось. Попробовал вернуться как json, но не понравился '' 'для всех значений. – Nick

1

Как программа RPGLE создания строки? Если он делает это по частям, то программа RPGLE могла бы, вероятно, добавить кавычки и правильно форматировать числа.

 Смежные вопросы

  • Нет связанных вопросов^_^