我有一个Logstash配置文件,格式如下:
input {
twitter {
keywords => ["apples","bananas", "cherries",
"lettuce", "tomatoes"]
follows => ["@sirwebber"]
... additional parameters ...
}
}
output {
elasticsearch {
... similar types of configuration stuff ...
}
}
我想将它解析为Node.js中的JSON对象。所以我正在寻找类似的东西:
{
"input": {
"twitter": {
"keywords": ["apples","bananas","cherries","lettuce","tomatoes"],
"follows": ["@sirwebber"],
... additional parameters ...
}
},
"output": {
... similar format ...
}
}
我的第一次尝试包括将文件作为字符串读取,然后解析新行字符(在分割后我是否对输入或输出感兴趣)。然后我拆分了' =>',我能够创建一个包含所需键和值的JavaScript对象。
只要我的值不跨越多行,此方法就可以正常工作。但是,我想确保解析器在一般情况下工作(可以在数组中的项之间包含空格)。
您对我应该做什么有什么建议吗?我需要编写自己的解析器吗?如果是这样,我是否应该参考如何编写这样的解析器?
答案 0 :(得分:0)
我会基于空格对字符串进行标记,然后运行标记:
var str = "input {\n\
twitter {\n\
keywords => [\"apples\",\"bananas\",\"cherries\"]\n\
follows => [\"@sirwebber\"]\n\
}\n\
}\n\
\n\
output {\n\
elasticsearch {\n\
something =>\n\
[\"hello\"]\n\
}\n\
}";
var tokens = str.split(/\s+/);
var js = "{";
var prev = '';
for (var i = 0; i < tokens.length; i++) {
var next = i+1 < tokens.length ? tokens[i+1] : '';
switch(tokens[i]) {
case '{':
js += ":{";
break;
case '=>':
js += ":";
break;
default:
if (next == "{" || next == '=>') { js += '"'; }
js += tokens[i] + (((prev == '=>' || prev=='}') && (next != '}' && next != '' && next != '{') )? ',' : '');
if (next == "{" || next == '=>') { js += '"'; }
break;
}
prev = tokens[i];
}
js += '}';
JSON.parse(js);