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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

2354閲覧

fetchしてきたネストされているjsonデータにアクセスしたい

lul

総合スコア1

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

JSON

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/08/08 04:25

前提

javascriptでapiを叩き、ネストされているjsonデータを取得しようとしたら以下のエラーメッセージが出ました。

Uncaught TypeError: Cannot read properties of undefined (reading '0')
at App.render (JSON.js:27:1)
at finishClassComponent (react-dom.development.js:19752:1)
at updateClassComponent (react-dom.development.js:19698:1)
at beginWork (react-dom.development.js:21611:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1)
at invokeGuardedCallback (react-dom.development.js:4277:1)
at beginWork$1 (react-dom.development.js:27451:1)
at performUnitOfWork (react-dom.development.js:26557:1)
at workLoopSync (react-dom.development.js:26466:1)

ネストされていないデータは問題なく取得できました。
fetchしてきたjsonも、resultsの中身も問題なく取得できています。

以下は取得したいjsonです
{
"count": 327,
"next": "https://pokeapi.co/api/v2/ability/?offset=20&limit=20",
"previous": null,
"results": [
{
"name": "stench",
"url": "https://pokeapi.co/api/v2/ability/1/"
},
{
"name": "drizzle",
"url": "https://pokeapi.co/api/v2/ability/2/"
}
]
}

実現したいこと

ネストされているデータを取得し、ローカルのWebページに表示させる

該当のソースコード

JavaScript

1 2import React, {Component} from "react" 3 4class App extends Component { 5 constructor(){ 6 super() 7 this.state = { 8 loading:false, 9 character:{}, 10 } 11 } 12 13 componentDidMount(){ 14 this.setState({ 15 loading: true 16 }) 17 fetch("https://pokeapi.co/api/v2/ability/") 18 .then(response => response.json()) 19 .then(data => { 20 this.setState({ 21 character: data, 22 loading: false 23 }) 24 }) 25 } 26 27 render() { 28 const displayText = this.state.loading ? "now loading...." : this.state.character.results[0].name 29 //results[0]がundefinedと表示され、displayTextの出力が意図したものにならない 30 31 console.log(this.state.character.results) 32   //こちらは問題なく表示される 33 34 return ( 35 <div> 36 {displayText} 37 </div> 38 ) 39 } 40} 41export default App 42

試したこと

・count、next、previousを取得(成功)
・resultsの全体をconsoleで表示(成功)
・resultsの特定の番目をconsoleで表示(失敗)Uncaught TypeError: Cannot read properties of undefined (reading '特定の番目')

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/08/08 04:42 編集

fetch待たずにレンダリングしているだけなんじゃないの? そうならasync/awaitを補えば済みそうな気がするけれど。
guest

回答2

0

ベストアンサー

初期状態でloading: falseとしているため、空のcharacter:{}についてcharacter.results[0].nameを読もうとして失敗しているようです。

componentDidMountより前のコンストラクタ時点でloading: trueとしておく、あるいはこのプロパティをloadedのようにしてロード完了後にtrueとする、ような形で対応するのがいいかと思います。

投稿2022/08/08 06:03

maisumakun

総合スコア145184

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

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

lul

2022/08/08 08:22

ありがとうございます。いただいたアドバイス通りにしてみたら解決しました! 重ねて質問なのですが、なぜcharacter.results[n]とした時だけ動かなかったのでしょうか? お時間あれば回答いただけるとありがたいです。
maisumakun

2022/08/08 09:09 編集

エラーメッセージのとおりです。初期状態でもcharacter.resultsはundefinedとして値が取れますが、undefinedに対するプロパティ参照([0])はReferenceErrorとなります。
guest

0

なにに躓いているのかよくわからないけれど、これでアクセスできている:

JavaScript

1const json = { 2"count": 327, 3"next": "https://pokeapi.co/api/v2/ability/?offset=20&limit=20", 4"previous": null, 5"results": [ 6{ 7"name": "stench", 8"url": "https://pokeapi.co/api/v2/ability/1/" 9}, 10{ 11"name": "drizzle", 12"url": "https://pokeapi.co/api/v2/ability/2/" 13} 14] 15}; 16for (let i = 0; i < json.results.length; i++) { 17 console.log(json.results[i].name); 18 console.log(json.results[i].url); 19}

投稿2022/08/08 04:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

lul

2022/08/08 08:18

ありがとうございます。例示していただいたコードは手元でもうまく行きました! また、非同期でrenderとfetchが動いているという考えには及ばなかったので勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問