Jeśli źródło danych nie może być stałe (numery powinny być przekazywane w postaci liczb, a nie jako ciągi znaków), you can pass JSON.parse
a "reviver" function, który otrzyma każdy element jak to jest przetwarzane.To daje możliwość przekształcenia go:
// 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
lub jeśli nazwy właściwości nie są wystarczająco wyjątkowy (TheProperty
nie zawsze potrzeba przenoszenia, tylko gdy jest to własność TheObject
), można to zrobić za pomocą czeku dwupoziomowego:
// 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 nazywane są wewnątrz-out, więc właściwości będą na obiekcie do czasu można zobaczyć obiekt na klucz;. dlatego aktualizować je na miejscu)
masz pomysł, tam dużo ty a do funkcji reviver.
Notatka: parseInt
, którego użyłem powyżej, jest dość wyrozumiały — ewentualnie bardziej wyrozumiały niż chcesz. Na przykład:
var a = parseInt('1a', 10); // 1, instead of NaN
Jeśli jesteś w porządku ze strunami jak "0x10"
leczony jako hex, a następnie:
var a = Number(str);
... co daje NaN
dla nieprawidłowych ciągów liczbowych (Number("1a")
jest NaN
) . Ponieważ JSON nie ma mieć liczb szesnastkowych, jeśli jesteś pewien, że uszkodzone źródło danych nie zakoduje ich jako heksadecymalnych, jesteś złoty.
W przeciwnym razie, jeśli potrzebujesz dziesiętnego, ale chcesz być ścisły, będziesz musiał zrobić wyraże regularne na ciągu, aby upewnić się, że pasuje do wzorca dla prawidłowej liczby dziesiętnej (co jest dość skomplikowane, jeśli chcesz obsługuje wszystkie rzeczy obsługiwane przez literały numeryczne JavaScript).
Jak zrobiłbyś to automagicznie, jeśli 'parseInt ('1a', 10);' zwraca '1'? Ale w każdym razie, nawet jeśli właściwość wygląda jak liczba - nie oznacza to, że jest numeryczna – zerkms
W przypadkach, w których uruchamiam funkcję parseInt, wiem, że jest to liczba. W przypadku, gdy właściwość może być liczbą, ale może również być liczbą 1a, należy użyć funkcji IsNumeric jquery. – frenchie
Jeśli ** numeryczny ciąg znaków ** jest liczbą zgodną ze źródłem, możesz dokonać konwersji, w przeciwnym razie nie. –