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

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

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

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2974閲覧

【JavaScript】APIから取得したJSONデータをDOM操作に利用する方法

moritat-222

総合スコア19

JSON

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/05/18 13:43

##前提・実現したいこと

APIから取得したJSONデータをDOM操作に利用しようとしているのですが、エラーが出てしまいます。

MDNの『JSONデータの操作』( https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/JSON )を参考にして、Data変数に、JSON を元にに生成された JavaScript オブジェクトを格納し、DOM操作を行う関数に引数として渡したのですが、うまくいきませんでした。

##当該のソースコード

JavaScript

1const url = 取得予定のJSONがあるURL 2let currentNum = 0; //JSONのresultsプロパティの何番目を取得するか 3 4const Data = fetch(url) 5 .then((response) => { 6 response.json() 7 .then((data)=>{ 8 data.results 9 }) 10 .catch((e)=>{ 11 console.log(e) 12 }) 13 }) 14 15console.log(Data) 16 17setQuiz(Data); 18}) 19 20function setQuiz(jsonObj){ 21 const Quiz = jsonObj[currentNum]; 22 23 document.getElementById('questionNumber').textContent = (currentNum+1)+"番目" 24 document.getElementById('question').textContent = Quiz.question //APIからとってきた質問 25 }) 26} 27

##問題点
・const Quiz = jsonObj[currentNum];
のところで、
"Cannot read property '0' of undefined"というエラーが出てしまう

・Quiz.question
のところで、
"Cannot read property 'question' of undefined"というエラーが出てしまう

##試したこと

・console.log(Data)
のところで、
"Promise{(<pending>)}"
とコンソールに表示されているため、JSONデータの取得自体はできているようです。

間違っている点、改善方法を指摘していただきたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

javascript

1const Data = fetch(url).then( ... );

となっている時点で、 Data に入っているのは Promise オブジェクトです。
一方で setQuiz 関数が要求する引数は JSON オブジェクトそのものです。
であれば Data.then(setQuiz) とすべきかと思います。

投稿2020/05/18 14:02

htsign

総合スコア870

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

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

moritat-222

2020/05/19 10:10

htsign様 回答ありがとうございます。 PromiseオブジェクトはJSONオブジェクトそのものではないのですね。 Data.thenでresolveすればJSONオブジェクトにできるとのこと、大変勉強になりました!
guest

0

htsign さんも書かれていますが、Fetchで取得したデータからJSONを取得するためには、一度jsonメソッドで値を抽出すつ必要があります。

こんな感じではどうでしょうか。

javascript

1const Data = fetch(url) 2 .then((response) => { 3 console.log(response.json()) // JSONが取得できていることを確認 4 return response.json() // ここでBody からJSONを返す 5 }) 6 .catch((e)=>{ 7 console.log(e) 8 }) 9 10 11// Fetch 取得が終了したら Data を resolve してPromiseオブジェクトを返す 12 13Data.then(result => { 14 setQuiz(result); 15}) 16 17function setQuiz(jsonObj){ 18 const Quiz = jsonObj[currentNum]; 19 20 document.getElementById('questionNumber').textContent = (currentNum+1)+"番目" 21 document.getElementById('question').textContent = Quiz.question //APIからとってきた質問 22}

※動作確認してません。動かなかったらすみません。

↓こちらのサンプルコードが参考になると思います。
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch

投稿2020/05/19 01:07

編集2020/05/19 02:50
apprentice

総合スコア67

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

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

htsign

2020/05/19 02:05

横からで申し訳ありません。 Data は既に Promise オブジェクトで、それに対して Promise.resolve を適用しても意味はありませんよ。 Promise<Promise<T>> は Promise<T> に flatten される、という仕様があるからです。 const createPromise = value => new Promise(resolve => resolve(value)); createPromise(1).then(one => createPromise(2).then(two => one + two)).then(console.log); とすると 3 が出力されるのが分かるかと思います(Promise の内部で Promise を作っているのにも関わらず)
apprentice

2020/05/19 02:50 編集

htsign さん、ありがとうございました。 ご指摘のとおり、わざわざ Promise.resolve する必要はありませんでした。 手元で書き直し、Data.then だけで resolveすることを確認しました。 私自身も勉強になりました。 コメントのコードは書き直します。
moritat-222

2020/05/19 10:07

apprentice様 回答ありがとうございました! 参考となるコードを書いていただいたため、とてもわかりやすかったです。 Data.then だけで resolveできるのでPromise.resolveは不要、とのこと、私も勉強できて大変良かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問