ありがとうございます。ありがとうございます。ありがとうございます。ありがとうございます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/13 08:09
2020/09/13 08:09
回答3件
0
前質問
過去記事と自分のjsonデータの文法が少し違うから、動かないのでは。。。?
とも思ったりしたのですが、関係ないでしょうか。
JSON文法の件は、前質問で解決したのではなかったのでしょうか。
無言でベストアンサーを選んでいますが、回答を読んで何をどう解釈して解決したのですか。
経験上、何も反応がない場合は、十分に理解せずに質問をクローズしているケースが大半ですが、本当に十分に理解しているのでしょうか。
JavaScriptの解説サイト
JavaScriptは立ち位置が特殊な言語で、
- 古いブラウザもサポートする必要がある
- 後方互換性を捨てられず、洗練されていない旧来の仕様を排除できない
- 複数ブラウザで動作するよう辻褄の合う仕様とする必要がある
- 公式仕様書は英語のみ(最新の日本語訳は2020/09/11現在、存在しない)
日本語の解説サイトはそこそこあるものの、全てにおいて完璧に正しいサイトはまず存在していません。
ECMAScriptなどの英語の仕様書を読む努力を怠らなければ問題は有りませんが、解読に時間が掛かります。
JSON.parse()
とはいえ、MDNは8-9割方は正解なので、そこを基盤として、自分自身で検証を進めて誤りを補正して、コーディングを行う人が大半かと思います。
例外
解析する文字列が有効な JSON でない場合、SyntaxError 例外が発生します。
JavaScript
1const jsonStr = `{ 2 "title": "タイトル", 3 "text": { 4 "menu": "タイトル", 5 "menu1": "タイトル", 6 "menu2": {} 7 }, 8 "text1": { 9 "menu3": "タイトル", 10 "menu4": "タイトル", 11 "menu5": {} 12 }, 13 "text2": { 14 "menu6": "タイトル", 15 "menu7": { 16 "menu8": { 17 "menu9": "タイトル", 18 "menu10": 120 19 } 20 } 21 } 22}`; 23 24JSON.parse(jsonStr);
SyntaxError
が発生しないので、このJSON文字列は文法的に正しいといえます。
あなたに必要なのは、正しい情報のサイトではなく、正しさを担保する手段です。
そういう目線でMDNを確認すれば、自分自身で検証することが出来ます。
Re: sadonnatakku さん
投稿2020/09/10 22:42
編集2020/09/10 22:58総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ありがたく思うなら解決していけ。複数アカウントがバレにくいように質問を削除するな。
ARP - jwosnwデータの文法について|teratail
JavaScript - JSONデータをシンプルにHTMLに直したい。|teratail
間違っているのは JSON ではなくスクリプトの方です。
前回の質問で確認した通り、JSON は間違っていません。
しかしながら、スクリプトに手を付けることなく JSON を書き換えることによって何らかの表示をしたいのであれば、二番目の追記のようにしてください。
JavaScript
1$.getJSON("data.json", function(data) { 2 for (var i in data) { 3 $("#wrap").append(`${i}`); 4 } 5// for (var i in data) { 6// var div = '<h5>' + 7// data[i].title + 8// '</h5>' + 9// '<div class="box">' + 10// '<ul class="inner-list">'; 11// for (var j in data[i].text) { 12// div += '<li>' + 13// data[i].menu[j].menu + 14// '</li>'; 15// } 16// div += '</ul>' + 17// '</div>'; 18// $("#wrap").append(div); 19// } 20});
以上のように書き換えたところ、次のように表示されました。
titletexttext1text2
御覧のように i
は JSON のトップレベルオブジェクトのプロパティを示しています。
しかしそれをどのように直せば意図通りになるかは、元々の意図がこのスクリプトでは不明なのでわかりません。
次にサンプルを上げますから、それを見て何がしたかったかを把握する材料にしてください。
JavaScript
1$(document).ready(function() { 2 $.getJSON("data.json", function(data) { 3 const toUl = element => { 4 const result = $("<ul>"); 5 for ([key, value] of Object.entries(element)) { 6 switch (typeof(value)) { 7 case "object": 8 result.append(toUl(value)); 9 break; 10 default: 11 result.append($("<li>").append(value)); 12 break; 13 } 14 } 15 return result; 16 }; 17 18 for ([key, value] of Object.entries(data)) { 19 switch (typeof(value)) { 20 case "string": 21 $("#wrap").append("<h5>").append(value); 22 break; 23 case "object": 24 $("#wrap").append(toUl(value)); 25 break; 26 } 27 } 28 }); 29});
追記 実行結果
追記
もし仮に、スクリプトには一切手を加えることなく、JSON の構造をどのように変えてもいいからなにがしか表示できるようにしたいということであれば、次のものを試してください。
[ { "title":"タイトル1", "text":[0, 1], "menu":[ {"menu":"メニュー0"}, {"menu":"メニュー1"} ] }, { "title":"タイトル2", "text":[0, 1, 2], "menu":[ {"menu":"メニュー0"}, {"menu":"メニュー1"}, {"menu":"メニュー2"} ] } ]
投稿2020/09/11 00:48
編集2020/09/13 08:32総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
根本的に理解が足りてないことは承知の上ですが、ご教示頂きたい
処理を分けて考えます。工程が決まれば、作業の原因がわかります。
- Ajax の応答
javascript
1$(document).ready(function() { 2 $.getJSON("data.json", function(data) { 3 // Ajax の結果が data に渡される。 4 }); 5});
- 応答されたデータ(1. で受け取った
data
)の確認
console.log()
を活用して、データを確認(アクセス方法の再確認など)
javascript
1var data = { /* omited */ }; // 開発者コンソールで試す等のとき 2 // ハードコードしてループ処理に集中する 3for (var key in data) { 4 let val = data[key]; 5 console.log( key, val ); 6}; 7/* 8=> 9 title タイトル 10 text {menu: "タイトル", menu1: "タイトル", menu2: {…}} 11 text1 {menu3: "タイトル", menu4: "タイトル", menu5: {…}} 12 text2 {menu6: "タイトル", menu7: {…}} 13*/
※ val が文字列か、object かで切り分ける必要があるとわかる。
ご質問のコードに if
や条件(三項)演算が、見当たらないので、この作業ができていないと分かる。
- データ変換の方針を検討
javascript
1for (var key in data) { 2 let val = data[key]; 3 if( "string" === typeof val ) { 4 5 } 6 else { 7 // 再帰処理を使うこともできそう? 8 } 9};
※ その他、Object.entries()
で、key, val を簡単に取り出す方法なども思いつく。
- HTMLへの挿し込み(HTML文書の動的編集)
- JSON->HTMLの場合
innerHTML
プロパティに文字列処理して操作。
2. JSON->DOMの場合
document.createElement()
、 document.appendChild()
などで操作。
面倒でも 2), 3) の作業を行うことで、目標到達がスムーズになります。
自分で使えそうなところを改変した
初心のうちは、反復処理はスクラッチで起こすくらいのほうが上達します。
2), 3) の作業で、少なからず「インプット」&「アウトプット」が発生するため。
投稿2020/09/11 05:15
総合スコア5434
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。