如果您的数据源无法固定(数字应作为数字传递,而不是作为字符串传递),您可以传递JSON.parse
一个“reviver”函数,它将接收正在处理的每个项目。这为您提供了转换它的选项:
// Create this once
var propsToConvert = {
TheProperty: 1,
TheOtherProperty: 1,
YetAnotherProperty: 1,
// ...and so on...
};
// Use it each time you parse
var obj = JSON.parse(str, function(key, value) {
if (propsToConvert.hasOwnProperty(key)) {
return parseInt(value, 10);
}
return value;
});
实例| 资源
或者,如果属性名称不够独特(TheProperty
并不总是需要处理,只是当它是 的属性时TheObject
),您可以将其作为两级检查来执行:
// Define the object names and their property names (once)
var propsToConvert = {
TheObject: {
TheProperty: 1,
TheOtherProperty: 1,
YetAnotherProperty: 1,
// ...and so on...
},
AnotherObject: {
// Other properties...
}
};
// Use it each time you parse
var obj = JSON.parse(str, function(key, value) {
var name, props;
if (typeof value === "object") {
props = propsToConvert[key];
if (props) {
for (name in props) {
value[name] = parseInt(value[name], 10);
}
}
}
});
(Revivers 被称为由内而外,所以当你看到对象的键时,属性将在对象上;这就是我们更新它们的原因。)
你明白了,你可以用 reviver 功能做很多事情。
旁注:parseInt
,我在上面使用过,是相当宽容的——可能比你想要的更宽容。例如:
var a = parseInt('1a', 10); // 1, instead of NaN
如果您可以接受像"0x10"
被视为十六进制的字符串,那么:
var a = Number(str);
...这将为您NaN
提供无效的数字字符串(Number("1a")
is NaN
)。由于 JSON 并不意味着具有十六进制数字,因此如果您确定损坏的数据源不会将它们编码为十六进制,那么您就是黄金。
否则,如果您需要小数但又想严格,则需要对字符串执行正则表达式以确保它与有效十进制数的模式匹配(如果您想支持所有内容,这相当复杂JavaScript 数字文字支持)。