質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

11612閲覧

Javascriptにおいて、JSONから特定のデータを出力する方法。

Shinog

総合スコア99

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/10/08 10:53

はじめまして。

Javascriptにおいて、以下のようなJSONから各Date(計3つ)のdate,limittを出力したいと考えています。

json

1 2[ 3 { 4 "Date": { 5 "date": "2015-10-02 18:04:00", 6 "id": "6", 7 "item_id": "30", 8 "limitt": "10" 9 }, 10 "Item": { 11 "adress": "出町柳", 12 "title": "ランニングエクササイズ", 13 "whom": "8" 14 }, 15 "Purchase": [ 16 { 17 "created": "2015-10-02 07:00:00", 18 "quantity": "5", 19 "user_id": "12" 20 }, 21 { 22 "created": "2015-10-03 00:00:00", 23 "quantity": "5", 24 "user_id": "12" 25 } 26 ] 27 }, 28 { 29 "Date": { 30 "date": "2015-10-11 18:05:00", 31 "id": "7", 32 "item_id": "30", 33 "limitt": "15" 34 }, 35 "Item": { 36 "adress": "出町柳", 37 "title": "ランニングエクササイズ", 38 "whom": "8" 39 }, 40 "Purchase": [ 41 { 42 "created": "2015-10-03 19:01:39", 43 "quantity": "1", 44 "user_id": "36" 45 } 46 ] 47 }, 48 { 49 "Date": { 50 "date": "2015-10-03 12:16:00", 51 "id": "8", 52 "item_id": "30", 53 "limitt": "3" 54 }, 55 "Item": { 56 "adress": "出町柳", 57 "title": "ランニングエクササイズ", 58 "whom": "8" 59 }, 60 "Purchase": [] 61 } 62]

そこで以下のコードまでは実装できたのですが、全てのデータが出力されてしまいます。

javascript

1<script type="text/javascript"> 2 3httpObj = new XMLHttpRequest(); 4httpObj.open("get", "data2.json", true); 5httpObj.onload = function(){ 6 var arr = JSON.parse(this.responseText); 7 var txt = ""; 8 9 for(var k in arr){ 10 var v = arr[k]; // 値をコピー 11 12 for(var k2 in v){ 13 var v2 = arr[k][k2]; 14 15 for(var k3 in v2){ 16 var v3 = arr[k][k2][k3]; 17 18 txt = txt + v3 + "<br>"; 19 } 20 21 } 22} 23 24 document.getElementById("result").innerHTML = txt; //<div id="result"></div>がbody上にあります。 25} 26httpObj.send(null); 27 28</script> 29

javascript

1httpObj.onload = function(){

また、上記のfunction()を除いたコードに変更したいと考えています。

このような場合、どのようにコードを修正すればよいでしょうか?
何かご存知の方は、是非ともご教授のほどよろしくお願いします。

※jQueryのgetJSONでは正常に出力できたものの、他のコードとの兼ね合いでこのような方法を選択しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

JSONparseをすると、以下のような構造の配列を受け取ります。

text

1root 2 - Date 3 - date 4 - id 5 - item_id 6 - limitt 7 - Item 8 - adress 9 - title 10 - whom 11 - Purchase 12 - created 13 - quantity 14 - user_id

例えば、
・2番目のItemの中のaddress
・1番目の2つ目のPurchaseの中のquantity
を、指定したい時は以下のように書きます。

javascript

1var item1 = root[1].Item.address; 2 // -> "出町柳" 3var item2 = root[0].Purchase[1].quantity; 4 // -> "5"

要するに、項目値が1個の場合は変数として指定し、
2個以上の場合は配列のように呼び出すのです。

これを踏まえて、要件は以下のように実装することができます。

javascript

1 <script> 2 var jsonSource = '[{"Date":{"date":"2015-10-0218:04:00","id":"6","item_id":"30","limitt":"10"},"Item":{"adress":"出町柳","title":"ランニングエクササイズ","whom":"8"},"Purchase":[{"created":"2015-10-0207:00:00","quantity":"5","user_id":"12"},{"created":"2015-10-0300:00:00","quantity":"5","user_id":"12"}]},{"Date":{"date":"2015-10-1118:05:00","id":"7","item_id":"30","limitt":"15"},"Item":{"adress":"出町柳","title":"ランニングエクササイズ","whom":"8"},"Purchase":[{"created":"2015-10-0319:01:39","quantity":"1","user_id":"36"}]},{"Date":{"date":"2015-10-0312:16:00","id":"8","item_id":"30","limitt":"3"},"Item":{"adress":"出町柳","title":"ランニングエクササイズ","whom":"8"},"Purchase":[]}]' 3 var contact = JSON.parse(jsonSource); 4 for (var i=0; i<contact.length; i++){ 5 document.write("Date["+i+"] - date : "+contact[i].Date.date+"<br>"); 6 document.write("Date["+i+"] - limitt : "+contact[i].Date.limitt+"<br>"); 7 } 8 </script>

すると、以下のようにHTMLに出力されます。

txt

1Date[0] - date : 2015-10-0218:04:00 2Date[0] - limitt : 10 3 4Date[1] - date : 2015-10-1118:05:00 5Date[1] - limitt : 15 6 7Date[2] - date : 2015-10-0312:16:00 8Date[2] - limitt : 3 9

という感じです。

投稿2015/10/08 12:00

SKYYFISH

総合スコア654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shinog

2015/10/08 13:18

丁寧かつ分かりやすいご説明ありがとうございます!! 上記のコードを用い、無事解決致しました。
guest

0

全てのデータが出力されてしまいます。

直接キーを指定してみてはどうでしょう。
サンプル)
for(var k in arr){
txt += arr[k]['Date']['date'];
txt += arr[k]['Date']['limitt'];
}
document.getElementById("result").innerHTML = txt;

また、上記のfunction()を除いたコードに変更したいと考えています。

こちらよくわかりません。
下記のような書き方で表現も出来ますが合ってますでしょうか。

httpObj.addEventListener('load' , callback);
function callback(){
// 処理
}

投稿2015/10/08 11:12

YuyaYasuda

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問