鉴于(作为职位回应机构):
RESULT: OK
RESULT_PS: FINISHED
RESULT_CODE: 000
我需要将它序列化为json,我使用节点的request从服务器获取它。 当然我可以逐字逐句地解析它。
答案 0 :(得分:1)
从以下代码中过滤每一行
var jsonObject = {}
function parser(str){
var arr = str.split(":");
jsonObject[arr[0]] = arr[1];
}
你的最终jsonObject是你需要的json。
确保你需要传递RESULT:OK,RESULT_PS:FINISHED,RESULT_CODE:000作为解析器的单独字符串。
答案 1 :(得分:1)
据我所知,这只是一个分隔的纯文本回复。 (你从哪里得到它?交易响应?)然而,由于它很简单,它可以通过快速的map-reduce操作轻松解析。
function trim(str) {
return str.replace(/^\s+|\s+$/g, "");
}
function nonEmpty(str) {
return null != str && str.length > 0;
}
function splitKeyValue(row) {
var tokens = row.split(":").map(trim);
// My assumption that a row should only contain 2 colon separated tokens
if (tokens.length > 2) {
throw new Error("Malformed row: " + row);
}
return tokens;
}
function merge(acc, item) {
// Normalise key to lower case, to guarantee spelling
acc[item[0].toLowerCase()] = item[1];
return acc;
}
function parseResponse(payload) {
return payload.split("\n").
filter(nonEmpty).
map(splitKeyValue).
reduce(merge, {});
}
使用上面的代码片段,结果应为:
var payload =
"RESULT: OK\n" +
"RESULT_PS: FINISHED\n" +
"RESULT_CODE: 000\n";
var parsed = parseResponse(payload);
console.log(parsed);
// Output:
// {
// result: "OK",
// result_ps: "FINISHED",
// result_code: "000"
// }
// Each separate field is then accessible from it's name
console.log(parsed.result); // Output: "OK"
答案 2 :(得分:0)
好的,没找到任何现成的解决方案。 所以写了这个函数:
parseResponse = function(response) {
var result = { };
response.replace(/([^\s:]+)\s*:\s*([^\n\s]+)/gi, function() {
var key = arguments[1], value = decodeURIComponent(arguments[2]);
result[key] = !isNaN(parseFloat(value)) && isFinite(value) ? parseFloat(value) : value;
});
return result;
}
答案 3 :(得分:0)
如果您使用node.js,则会有一个名为querystring的便捷模块:
const querystring = require('querystring'),
payload =
"RESULT: OK\n\r" +
"RESULT_PS: FINISHED\n" +
"RESULT_CODE: 000\n";
let parsed = querystring.parse(payload, '\n', ':', {decodeURIComponent: s => s.trim()});
console.log(parsed);
对于浏览器,答案中描述了很多好的方法。这是另一个(香草JS):
var payload =
"RESULT: OK\n\r" +
"RESULT_PS: FINISHED\n" +
"RESULT_CODE: 000\n";
var browserParsed = payload.split("\n")
.map(function (s) {
return s.trim().split(":");
})
.filter(function (s) {
return s.length && s.length > 1;
})
.reduce(function (acc, c) {
acc[ c[ 0 ].trim() ] = c[ 1 ].trim();
return acc;
}, {});
console.log(browserParsed);