データソースを修正できない場合(数値は文字列ではなく数値として渡す必要があります)、処理中に各アイテムを受け取る「リバイバー」関数を渡すことができます。JSON.parse
これにより、変換するオプションが提供されます。
// 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
ません)、2レベルのチェックとしてこれを行うことができます。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);
}
}
}
});
(リバイバーは裏返しに呼び出されるため、オブジェクトのキーが表示されるまでにプロパティはオブジェクト上にあります。そのため、プロパティはその場で更新されます。)
あなたはその考えを理解します、あなたがリバイバー機能でできることはたくさんあります。
補足:parseInt
私が上で使用したものは、かなり寛容です—おそらくあなたが望むよりも寛容です。例えば:
var a = parseInt('1a', 10); // 1, instead of NaN
"0x10"
16進数として扱われるような文字列で問題がない場合は、次のようにします。
var a = Number(str);
...NaN
無効な数値文字列(Number("1a")
is NaN
)が表示されます。JSONは16進数を使用することを意図していないため、壊れたデータソースがそれらを16進数としてエンコードしないことが確実であれば、あなたは黄金です。
それ以外の場合、10進数が必要であるが厳密にしたい場合は、文字列に対して正規表現を実行して、有効な10進数のパターンと一致することを確認する必要があります(すべてのものをサポートする場合は、かなり複雑です)。 JavaScript数値リテラルのサポート)。