另一种方法:构建JSON.stringify
定制版本,它带有小数点将一直输出数字。
这仅仅需要从Mozilla JSON documentation的示例实现和修改的代码来处理数字的行:
window.JSON.stringifyDecimal = (function(){
var toString = Object.prototype.toString;
var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; };
var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
return function stringify(value) {
if (value == null) {
return 'null';
} else if (typeof value === 'number') {
// Ensure decimal point is present
return isFinite(value) ? value.toString() + (Number.isInteger(value) ? '.0' : '') : 'null';
} else if (typeof value === 'boolean') {
return value.toString();
} else if (typeof value === 'object') {
if (typeof value.toJSON === 'function') {
return stringify(value.toJSON());
} else if (isArray(value)) {
var res = '[';
for (var i = 0; i < value.length; i++)
res += (i ? ', ' : '') + stringify(value[i]);
return res + ']';
} else if (toString.call(value) === '[object Object]') {
var tmp = [];
for (var k in value) {
if (value.hasOwnProperty(k))
tmp.push(stringify(k) + ': ' + stringify(value[k]));
}
return '{' + tmp.join(', ') + '}';
}
}
return '"' + value.toString().replace(escRE, escFunc) + '"';
};
})();
在JSON唯一数字型十进制浮点。您的值'1.0'完全等同于'1'。问题不在于'JSON.stringify()',而是您的服务器API错误地解释了JSON。 – Pointy
迷人!所以Elasticsearch(见https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-core-types.html的第二句)只是傻瓜做的破解软件。我一直都很怀疑。无论如何,我坚持使用它,所以希望我能找到一些破解在JavaScript中做到这一点。 –
这并不准确。没有任何其他上下文来指示精度(这不是JSON本身可以做的事情)的值“1.0”与**值“1”完全相同。 – Pointy