JavaScriptを使用して、JSONオブジェクトのキーバリューとオブジェクトの長さを取得する方法です。 例を挙げます。
[
{
"amount": " 12185",
"job": "GAPA",
"month": "JANUARY",
"year": "2010"
},
{
"amount": "147421",
"job": "GAPA",
"month": "MAY",
"year": "2010"
},
{
"amount": "2347",
"job": "GAPA",
"month": "AUGUST",
"year": "2010"
}
]
ここでは、配列の長さは3で、値の取得は([0].amount)
でよく、インデックス[0]
には3つの名前と値のペアがあります。
だから、名前(amountとかjobとか、全部で4つの名前)を取得して、さらに名前がいくつあるかをカウントする必要があります。
Jsonは基本的にJavascriptの連想配列として表現されます。キーや値を読み取るためには、それらをループさせる必要があります。
var JsonObj= { "one":1, "two":2, "three":3, "four":4, "five":5 };
//read key
for (var key in JsonObj) {
console.log(key);
console.log(JsonObj[key]);
}
まず第一に、あなたが扱っているのは「JSONオブジェクト」ではなく「JavaScriptオブジェクト」です。JSONはテキストの表記法ですが、もしあなたのサンプルコード([0].amount
)が機能するなら、あなたはすでにその表記法をJavaScriptのオブジェクトグラフにデシリアライズしています。(JSON](http://json.org)では、キーは二重引用符で囲む必要があります。あなたが引用したものは、JSONのスーパーセットであるJavaScriptオブジェクトリテラルです)。
ここでは、この配列の長さは2です。
いいえ、3です。
そこで、名前(金額や仕事など、全部で4つの名前)を取得し、さらに名前がいくつあるかをカウントする必要があるのですが?
ECMAScript5を完全にサポートしている環境であれば、Object.keys
(spec | MDN)を使って、オブジェクトの1つに対する列挙可能なキーを配列として取得できます。そうでない場合(あるいは、配列を取得するのではなく、単にループさせたい場合)は、for...in
を使用することができます。
var entry;
var name;
entry = array[0];
for (name in entry) {
// here, `name` will be "amount", "job", "month", then "year" (in no defined order)
}
完全な動作例です。
(function() {
var array = [
{
amount: 12185,
job: "GAPA",
month: "JANUARY",
year: "2010"
},
{
amount: 147421,
job: "GAPA",
month: "MAY",
year: "2010"
},
{
amount: 2347,
job: "GAPA",
month: "AUGUST",
year: "2010"
}
];
var entry;
var name;
var count;
entry = array[0];
display("Keys for entry 0:");
count = 0;
for (name in entry) {
display(name);
++count;
}
display("Total enumerable keys: " + count);
// === Basic utility functions
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
})();
生のオブジェクトを扱っているので、上記の for...in
ループは問題ありません(誰かが Object.prototype
をいじったという罪を犯していなければですが、そうでないと仮定しましょう)。しかし、キーを取得したいオブジェクトが、そのプロトタイプから列挙可能なプロパティを継承している可能性がある場合は、hasOwnProperty
の呼び出しを追加することで、ループをオブジェクトのownキーのみに制限することができます(そのプロトタイプのキーではありません)。
for (name in entry) {
if (entry.hasOwnProperty(name)) {
display(name);
++count;
}
}