我有一个以下格式的 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 对象。
只要我的值不跨越多行,此方法就有效。但是,我想确保解析器在一般情况下工作(可以包括数组中项目之间的空格)。
你对我应该怎么做有什么建议吗?我需要编写自己的解析器吗?如果是这样,我应该参考关于如何编写这样的解析器的好资源吗?
我会根据空格对字符串进行标记化,然后运行标记:
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);