Wenn Ihre Datenquelle nicht festgelegt werden kann (Zahlen sollten als Zahlen übergeben werden, nicht als Strings), you can pass JSON.parse
a "reviver" function, die jedes Element empfangen werden, wie es verarbeitet werden wird.Dies gibt Ihnen die Möglichkeit, es zu verwandeln:
// 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
Oder wenn die Eigenschaftsnamen sind nicht ausreichend eindeutig (TheProperty
nicht immer braucht Handhabung, nur wenn es eine Eigenschaft von TheObject
), können Sie dies als ein Zwei-Ebenen-Check tun:
// 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);
}
}
}
});
(Auferstehungs sind von innen nach außen, so genannt, werden die Eigenschaften durch die Zeit, die Sie das Objekt der Schlüssel zu sehen auf dem Objekt sein;. Deshalb haben wir sie an ihrem Platz aktualisieren)
Sie auf die Idee kommen, gibt es eine viel du c ein mit reviver Funktionen tun.
Randbemerkung: parseInt
, die ich oben verwendet haben, ist ziemlich nachsichtig — möglicherweise mehr zu vergeben als Sie wollen. Zum Beispiel:
var a = parseInt('1a', 10); // 1, instead of NaN
Wenn Sie mit Zeichenketten wie "0x10"
werden so behandelt, als hex in Ordnung sind, dann:
var a = Number(str);
... die Sie NaN
für ungültige Zahlenketten geben (Number("1a")
ist NaN
) . Da JSON keine Hexadezimalzahlen haben soll, wenn Sie sicher sind, dass die defekte Datenquelle sie nicht als Hex kodiert, sind Sie golden.
Andernfalls, wenn Sie dezimale benötigen, aber Sie strikt sein möchten, müssen Sie eine Regex für die Zeichenfolge, um sicherzustellen, dass es mit dem Muster für eine gültige Dezimalzahl (das ist ziemlich komplex, wenn Sie möchten) übereinstimmen Unterstützung all das Zeug JavaScript numerische Literale Unterstützung).
Wie würden Sie das automatisch machen, wenn 'parseInt ('1a', 10);' '' 'zurückgibt? Aber egal, auch wenn eine Eigenschaft wie eine Zahl aussieht - das heißt nicht, dass sie numerisch ist. – zerkms
In den Fällen, in denen ich die parseInt-Funktion ausführe, weiß ich, dass es eine Zahl ist. Für den Fall, dass die Eigenschaft eine Zahl sein könnte, aber auch 1a, müssten Sie die IsNumeric-Funktion von jquery verwenden. – frenchie
Wenn die ** numerische Zeichenkette ** die Nummer gemäß der Quelle ist, dann können Sie konvertieren, sonst nicht. –