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

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

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

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

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaScript

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

Q&A

解決済

3回答

256閲覧

[JavaScript]fetch関数で取得したJSONデータが実際の返り値の形と異なる

donut4

総合スコア170

HTTP

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

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

JavaScript

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

0グッド

1クリップ

投稿2024/09/17 08:06

編集2024/09/17 08:11

実現したいこと

Next.jsを使ってローカルで自作アプリを作っています。
サーバーサイド言語とフロントを別々にして作っていて、fetch関数でサーバーからのデータを取得していますが、fetch関数とjson関数でJSON化した後の、配列内のオブジェクトの中身が実際の中身と異なっています。

発生している問題・分からないこと

先述のとおり、fetch関数でサーバーからのデータを取得してjson関数でJSON化した後の、配列内のオブジェクトの中身が実際の中身と異なっています。

サーバー言語のデバックで取得したJSONと
フロント側でfetch関数&json関数で取得したJSON
内の配列内のオブジェクトの数が異なります。

より詳しい情報はソースコードを後述します。
(keyなどの文字列は変えています。)

該当のソースコード

//サーバー言語のデバックで取得したJSON [ { class: [ { name: "class1", grade: "XX", }, { name: "class2", grade: "XX", }, ], }, { user: [ { name: "XXXX", age: "XX", grade: "XX", }, { name: "XXXXXXXXXX", age: "XX", grade: "XX", }, ], }, ]
//フロント側でfetch関数&json関数で取得したJSON [ { class: [ { name: "class1", grade: "XX", }, { name: "class2", grade: "XX", }, ], }, { user: [ { name: "XXXX", age: "XX", grade: "XX", }, //配列内のオブジェクト内の数が一つしかない ], }, ]

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

バックエンドのソースコードを確認してみましたが先述した戻り値と変わらずでした。

補足

Next.js(Ver14)

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

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

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

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

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

int32_t

2024/09/17 11:02

JSONデータだけ見ても原因がわからないので、JSONを生成しているコードとJSONをパーズしているコード、内容の確認のためにしたことを具体的に書いてください。
guest

回答3

0

自己解決

一番最初にfetchで取得してきたデータがキャッシュされ、何度も再利用されていることが原因だったようで、以下のようにfetch関数にcache: 'no-store' をつけたら解決しました。

//修正前 const res = await fetch(`http://127.0.0.1:3000/XXXXXX`); const result = await res.json(); //修正後 const res = await fetch(`http://127.0.0.1:3000/XXXXXX`, { cache: 'no-store', }); const result = await res.json();

投稿2024/09/18 05:05

donut4

総合スコア170

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

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

0

まずはJSONについての理解が不足しているので、「jSONとは何なのか」から学び直しましょう。

それはそれとして、
まずは、fetchで得た文字列をそのまま確認しましょう。
つまり、json()でなくtext()でそのままの文字列を取得して表示しましょう。
それがサーバーから送られてきた文字列です。サーバー側で「こういう文字列を送っているはずだ」という物と異なる場合は、「こういう文字列を送っているはずだ」という推測が間違っていたと言うことです(もしくは途中で書き換わっている)。

さらに、

json関数で取得したJSON

とお書きですが、fetchの続きのjson()で取得する物はJSONではありません。
(json()はJSONに解決されるPromiseを返さない。JavaScript オブジェクトに解決される Promiseを返します)
それは先のこととして、

とりあえず、text()で得た文字列を見てからその先を考えましょう。

//サーバー言語のデバックで取得したJSON

にお書きの文字列(JSONとして不正な文字列)がサーバーから返っているなら、json()がエラーになるはずです。エラーになってないなら違うのでしょう。

投稿2024/09/17 11:51

otn

総合スコア85781

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

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

donut4

2024/09/18 05:03

返信ありがとうございます。 一番最初にfetchで取得してきたデータがキャッシュされ、何度も再利用されていることが原因だったようで、fetch関数にcache: 'no-store' をつけてみたら解決しました。
guest

0

例示のデータがそもそもちゃんとしたJSONデータになっていませんね

  • キーにもエンクロージャが必要
  • 最後のデータにカンマをつけてはNG
  • 本データにはないとは思いますがコメントもNG

投稿2024/09/17 08:28

yambejp

総合スコア116468

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

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

donut4

2024/09/18 05:03

返信ありがとうございます。 一番最初にfetchで取得してきたデータがキャッシュされ、何度も再利用されていることが原因だったようで、fetch関数にcache: 'no-store' をつけてみたら解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問