2017-02-21 91 views
0

很新的Node.js的,我有串从RPGLE(AS400)计划回国,我想回如下JSON的例子。字符串转换为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}, 

想如下转换并发送至应用程序API

[{"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_]',所以这些字符中的任何一个用于一个或多个字符(用'+'表示, *',而不是0或更多,它是1或更多),它用'(...)'捕获到一个捕获组中,'(?= :)'是一个以'(?=。 ..“),它对于单个冒号字符”向前看“,该模式匹配任何后跟冒号的单词它用自己包裹在引号(''“$ 1”''')中替换我们捕获的组。 –

2

你可以解析行成有效的JavaScript对象,然后将这些字符串化到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

感谢您的帮助,但接受我们的答案工作。尝试了你的建议,但是它以'text/plain'和API的形式返回API,并且它不喜欢那样。尝试返回为json,但不喜欢'''所有值。 – Nick

1

的RPGLE程序如何创建字符串?如果它是一片一片地做,那么RPGLE程序可能会添加引号并正确地格式化数字。