Node.js如何将冒号分隔的键值对序列化为JSON

时间:2015-07-07 10:31:17

标签: javascript node.js request

鉴于(作为职位回应机构):

RESULT: OK
RESULT_PS: FINISHED
RESULT_CODE: 000

我需要将它序列化为json,我使用节点的request从服务器获取它。 当然我可以逐字逐句地解析它。

  1. 但是,有没有更简单的方法?
  2. 也许准备好序列化程序或者将这些数据序列化为JSON?
  3. 这是什么格式?

4 个答案:

答案 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);