JavaScriptのPromiseでよく使うfetch()メソッドとJSONについて
JavaScriptのPromiseでよく使うfetch()メソッドとjsonファイルについてまとめました。
Promiseの書き方は次の記事を参考にしてみてください。
jsonファイルについて
jsonファイルについて、基本的には配列のような[]の中に、オブジェクトのような{}の形式でデータが羅列されています。
[
{
"name": "yamada",
"age": 30
},
{
"name": "sasaki",
"age": 40
},
{
"name": "kondo",
"age": 16
}
]
基本的にはJavaScriptの配列とオブジェクトの形式でOKなのですが、異なる点があるので、次の3点だけは押さえておきましょう。
- jsonファイルでは、シングルクォーテーションで文字列を囲むことはできません。必ずダブルクオーテーションを使います。
- JavaScriptではプロパティは囲む必要はありませんが、jsonファイルでは、必ずプロパティもダブルクオーテーションで囲います。
- JavaScriptでは最後にカンマを付けてもいいのですが、jsonファイルでは、最後のデータにカンマをつけてはいけません。
JSON(文字列)の操作
JSONは、JavaScriptのオブジェクトにとてもよく似ていますが、JavaScriptでは文字列扱いとなります。
JSONオブジェクトのメソッドを使うことで操作できるようになります。
JSON.stringify()メソッド
JSON.stringify()メソッドはオブジェクトをJSON(文字列)に変換します。
//オブジェクト
const object1 = { a: 0, aa: 1, aaa: 3 };
console.log(object1);//{a: 0, aa: 1, aaa: 3}
//JSON文字列に変換する
const json = JSON.stringify(object1);
console.log(json); //{"a":0,"aa":1,"aaa":3}
console.log(typeof json); //string
このように、オブジェクトがJSONデータに変換されます。
また、typeofでstringが返されることで、JSONデータは、文字列であることがわかります。
JSON.stringify()の第二引数
JSON.stringify()の第二引数に配列や関数をとることで、特定の条件でJSONの文字列を出力できます。
関数には、引数にプロパティとその値を設定します。それらが1ループごとにまわってきます。
//オブジェクト
const object1 = { a: 0, aa: 1, aaa: 3 };
//第二引数に関数をとる
function replacer(prop, val) {
// 2より上の数字のみ返すという条件とする
if (val < 2) {
return;
}
return val;
}
const json2 = JSON.stringify(object1, replacer);
console.log(json2); //{"aaa":3}
配列の場合は、オブジェクトのプロパティを文字列で指定します。
//オブジェクト
const object1 = { a: 0, aa: 1, aaa: 3 };
//第二引数に配列をとる
const json3 = JSON.stringify(object1, ["a","aaa"]);
console.log(json3);//{"a":0,"aaa":3}
指定したプロパティと値を格納したJSON(文字列)が生成されます。
JSON.parse()メソッド
JSON.parse()メソッドは、JSON(文字列)からオブジェクトに変換します。
//オブジェクト
const object2 = { a: 0, aa: 1, aaa: 3 };
//JSON文字列に変換する
const json = JSON.stringify(object2, ["a", "aaa"]);
// JSON文字列からオブジェクトに変換する
const parsedObj = JSON.parse(json);
console.log(parsedObj); //{a: 0, aaa: 3}
fetch()メソッド
fetch()メソッドを使うことで、サーバー上からデータを取得できます。
fetch()メソッドの使い方
window.fetch()なので、windowは省略できます。
fetch()の第一引数にリクエスト先のURLを記述します。
同じ階層にusers.jsonというファイルを置いたとします。
console.log(fetch('users.json'));
//Promise {}
そうすると、コンソールで確認するとPromiseが返されていることがわかります。
つまり、then()メソッドでチェーンすることが可能です。
サーバーから返されたデータについて
then()メソッドでチェーンすることでサーバーから返されたデータの中身をみることができます。
fetch('users.json').then(function (response) {
console.log(response);
});
//Response {type: "basic", url: "http://...users.json",
// redirected: false, status: 200, ok: true, …}
このresponseには、サーバーから返されたデータが格納されています。
そして、たとえばOK: trueならサーバーからデータが取得できたという意味となります。
status: 200はhttp statusのことで、通信が問題なく完了したことを表します。
protoを確認するといろんなメソッドが使えることがわかります。
その中でもjson()メソッドはよく使います。
json()メソッド
json()メソッドを使うことで、ようやく加工できるデータが手に入ります。
fetch('users.json')
.then(function (response) {
console.log(response);
return response.json();
})
.then(function (json) {
console.log(json);
});
// (3) [{…}, {…}, {…}]
// 0: {name: "yamada", age: 30}
// 1: {name: "sasaki", age: 40}
// 2: {name: "kondo", age: 16}
このようにjson()メソッドを使うことで、格納されていたjsonファイルのデータを取得することができます。
jsonファイルのデータを加工する
fetch('users.json')
.then(function (response) {
console.log(response);
return response.json();
})
.then(function (json) {
console.log(json);
for (const user of json) {
console.log(`私は${user.name}です。${user.age}才です。`);
}
});
// 私はyamadaです。30才です。
// 私はsasakiです。40才です。
// 私はkondoです。16才です。
このようにして、jsonファイルのデータを好きなように加工することができます。
- fetch()はPromiseのオブジェクトを返す
- responseは、jsonデータが格納されているresponseオブジェクト
- jsonデータを加工するためには、json()メソッドを使う必要がある
というこの3点は重要な点になります。
response.json()の戻り値もPromiseになります。
これをasync/awaitを使って記述します。
async/awaitとfetch()メソッド
async/awaitで上の例文を書き換えると、次のようになります。
async function fetchData() {
const response = await fetch('users.json');
const json = await response.json();
for (const user of json) {
console.log(`私は${user.name}です。${user.age}才です。`);
}
}
fetchData();
// 私はyamadaです。30才です。
// 私はsasakiです。40才です。
// 私はkondoです。16才です。
よりスッキリとしたコードになります。
Promiseをより直感的に記述できるasync/awaitに関しては次の記事を参考にしてみてください。