更清晰的解析解析消息并返回json

时间:2016-07-14 23:15:05

标签: javascript json

我正在编写一个函数来订阅通过蓝牙传输数据并解析它,最后将特定信息返回到输出json。

我的邮件格式为'标题' ID'' Ggid'' Ppayload'' Ttimestamp&# 39;,' AsigA'' BsigB&#39 ;.在这种格式中,每个段之间没有空格,只有一个逗号。此格式只需要Id和Header。标题是静态的,并且始终以' H开头。除了' Id'之外,其他信息将以大写字母开头。例如,Id段可以是12345678,但有效载荷段将是P12345678。目前,我有一个非常复杂的代码来解析这些信息。

示例消息是一个字符串:H,00198601,GLOCATE,P762,T1.50,A64,B67

var len = Message.length;
app.outputTagJson.Tag = {};
if (len >= 2)
{
    app.outputTagJson.Tag.tagID = Message[1];
    app.outputTagJson.Tag.isLost = "False";
    if (len >= 3)
    {
        app.outputTagJson.Tag.groupID = Message[2].slice(1,Message[2].length);
        if (len >= 4)
        {
            app.outputTagJson.Tag.payload = Message[3].slice(1,Message[3].length);
            if (len >= 5)
            {
                app.outputTagJson.Tag.timeStamp = Message[4].slice(1,Message[4].length);
                if (len >= 6)
                {
                    app.outputTagJson.Tag.sigStrenthA = Message[5].slice(1,Message[5].length);
                    if (len >= 7)
                    {
                        app.outputTagJson.Tag.sigStrenthB = Message[6].slice(1,Message[6].length);
                    }
                }
            }
        }
    }
}

我正在考虑使用通用正则表达式在javascript中删除此格式,但我并不熟悉它。那么有没有使用正则表达式的清洁解决方案,或者如果我必须使用正则表达式,我该如何处理?

3 个答案:

答案 0 :(得分:2)

试一试?



var input = 'H,00198601,GLOCATE,P762,T1.50,A64,B67';

var fieldMap = {
    G: 'groupID',
    P: 'payload',
    T: 'timeStamp',
    A: 'sigStrengthA', // NOTE: you misspelled "strength"
    B: 'sigStrengthB',
};

var fields = input.split(',');
var tag = {};

tag.tagID = fields[1];

fields.slice(2).forEach(function (field) {
    tag[fieldMap[field[0]]] = field.substring(1);
});

console.log(JSON.stringify(tag, null, 4));

// Output:
// {
//     "tagID": "00198601",
//     "groupID": "LOCATE",
//     "payload": "762",
//     "timeStamp": "1.50",
//     "sigStrengthA": "64",
//     "sigStrengthB": "67"
// }




修改

另一种纯粹依赖于字段顺序的解决方案(现在我看到字段总是以相同的顺序):



var input = 'H,00198601,GLOCATE,P762,T1.50,A64,B67';

var fieldNames = [
    'tagID',
    'groupID',
    'payload',
    'timeStamp',
    'sigStrengthA',
    'sigStrengthB',
];

var tag = {};
var fields = input.split(',');
for (var i = 1; i < fields.length; i++) {
    tag[fieldNames[i-1]] = fields[i].substring(i === 1 ? 0 : 1);
}

console.log(JSON.stringify(tag, null, 4));

// Output:
// {
//     "tagID": "00198601",
//     "groupID": "LOCATE",
//     "payload": "762",
//     "timeStamp": "1.50",
//     "sigStrengthA": "64",
//     "sigStrengthB": "67"
// }
&#13;
&#13;
&#13;

答案 1 :(得分:2)

这可能是一个很好的机会,可以使用这样一个事实:在switch语句中,它会一直执行下面的语句,直到它达到break。此外,当您没有指定第二个参数时,slice会结束。

&#13;
&#13;
var input = "H,00198601,GLOCATE,P762,T1.50,A64,B67",
    message = input.split(","),
    tag = {};
switch (message.length) {
  default:
  case 7: tag.sigStrengthB = message[6].slice(1);
  case 6: tag.sigStrengthA = message[5].slice(1);
  case 5: tag.timeStamp = message[4].slice(1);
  case 4: tag.payload = message[3].slice(1);
  case 3: tag.groupID = message[2].slice(1);
  case 2: tag.tagID = message[1];
          tag.isLost = "False";
  case 1:
  case 0: break;
}
console.log(tag);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

根据你的代码(我不确切知道它是什么),它可以像这样重写:

var len = Message.length;
var props = ['tagID','groupID','payload','timeStamp','sigStrenthA','sigStrenthB'];
app.outputTagJson.Tag = {};
if (len >= 2)
{
    app.outputTagJson.Tag[props[0]] = Message[1];
    app.outputTagJson.Tag.isLost = "False";
    for(var i=3;i<=len;i++)
        app.outputTagJson.Tag[props[i-2]] = Message[i-1].slice(1,Message[i-1].length);
}