Si el origen de datos no se puede arreglar (los números deben ser pasados como números, no como cadenas), you can pass JSON.parse
a "reviver" function, que recibirá cada elemento, ya que está siendo procesado.Esto le da la opción de transformarlo:
// 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;
});
Live example | source
O si los nombres de las propiedades no son lo suficientemente único (TheProperty
no lo hace siempre necesita manipulación, justo cuando se trata de una propiedad de TheObject
), se puede hacer esto como un cheque de dos niveles:
// 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);
}
}
}
});
(Resucitadores son llamados de dentro a fuera, por lo que las propiedades habrá en el objeto en el momento en que se ve la clave del objeto;. es por eso que actualizamos en su lugar)
usted consigue la idea, hay mucho tu c un hacer con las funciones reviver.
Nota al margen: parseInt
, que he utilizado anteriormente, es bastante indulgente — posiblemente más tolerante que desea. Por ejemplo:
var a = parseInt('1a', 10); // 1, instead of NaN
Si estás bien con cadenas como "0x10"
siendo tratados como hexagonal, entonces:
var a = Number(str);
... lo cual le dará NaN
para cadenas de números no válidos (es Number("1a")
NaN
) . Dado que JSON no está destinado a tener números hexadecimales, si estás seguro de que la fuente de datos fragmentada no los codificará como hexadecimal, estás dorado.
De lo contrario, si necesita un decimal pero desea ser estricto, tendrá que hacer una expresión regular en la cadena para asegurarse de que coincida con el patrón de un número decimal válido (que es bastante complejo, si lo desea admitir todo el soporte de los literales numéricos de JavaScript).
¿Cómo lo haría automágicamente si 'parseInt ('1a', 10);' devuelve '1'? Pero de todos modos, incluso si la propiedad se parece a un número, no significa que sea numérica – zerkms
En los casos en que ejecuto la función parseInt, sé que es un número. Para el caso donde la propiedad podría ser un número pero también podría ser 1a, necesitaría usar la función IsNumeric de jquery. – frenchie
Si ** la cadena de caracteres numéricos ** son números de acuerdo con la fuente, entonces puede convertir, de lo contrario no. –