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

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

本文关键字:分隔 键值对 JSON js 序列化 Node      更新时间:2023-09-26

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

RESULT: OK
RESULT_PS: FINISHED
RESULT_CODE: 000

我需要序列化它到json,我使用节点的请求从服务器得到这个。我当然可以一个字符串一个字符串地解析它。

    但是没有更简单的方法吗?也许准备好序列化器或其他东西序列化这样的数据JSON?
  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作为与解析器分开的字符串传递。

据我所知,这只是一个带分隔符的纯文本响应。你从哪里得到的?事务响应吗?)然而,因为它很简单,所以很容易用一个快速的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"

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

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

如果你使用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);