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

Node.js How To serialize colon separated key value pairs to JSON

给定(作为 post 响应正文):

RESULT: OK
RESULT_PS: FINISHED
RESULT_CODE: 000

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

  1. 但是没有更简单的方法吗?
  2. 也许准备好序列化器或其他东西将此类数据序列化为 JSON?
  3. 这是什么格式?

从以下代码中筛选出每一行

var jsonObject = {}

function parser(str){
var arr = str.split(":");
jsonObject[arr[0]] = arr[1];
}

你的最终json对象是你需要的json。
确保您需要传递 RESULT: OK, RESULT_PS: FINISHED,RESULT_CODE: 000 作为来自解析器的单独字符串。

好的,没有找到现成的解决方案。 于是写了这个函数:

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;
}

据我所知,这只是一个带分隔符的纯文本回复。 (你从哪里得到它?交易响应?)但是,因为它很简单,所以很容易通过快速的 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"

如果你使用node.js there is handy module called 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);