🛸

javascriptでjsonを扱う

2022/07/03に公開

目的

jsonの取り扱いについて、ざっくり学んで行こうと思います。
使用する言語はjavascriptです。

環境

OS:Windows 10 Pro
IDE:VSCode バージョン(1.68.1)
docker:Docker version 20.10.16
docker-compose:docker-compose version 1.29.2
docker container:amazon linux 2 + nginx 1.20

jsonとは

mozillaの公式に以下の説明がありました

JavaScript Object Notation (JSON) は、構造化データを表現するための標準のテキストベースの形式で、 JavaScript のオブジェクト構文に基づいています。ウェブアプリケーションでデータを転送する場合によく使われます(例えば、複数のデータをサーバーからクライアントへ送信して、ウェブページ上に表示する場合などで、その逆もあります)。頻繁に見かけるデータ形式ですので、この記事では JavaScript を使用して JSON を扱うのに必要なすべてのこと、例えば JSON を解釈してその中のデータにアクセスしたり、 JSON を作成したりする方法を説明します。

詳細はこちら

実際のjson

{
    "name": "batton",
    "age": 43,
    "gender": "man",
    "active": true,
    "article": [
        {
            "title": "Docker Desktopが便利だった",
            "length": 3108,
            "active": true
        },
        {
            "title": "よく使うdocker-composeコマンド、まとめ",
            "length": 4374,
            "active": false
        },
        {
            "title": "Dockerfileでコンテナ破壊しほうだい",
            "length": 2885,
            "active": true
        }
    ]
}

zennでの記事をjson形式で表現しました。
name,age,gender,activeは基本情報、articleに3つの情報を持たせています。

jsonを処理してみる

javascriptを利用しjsonを処理してみようと思います。
dockerでnginxを起動して、動作確認します。
※windowsでjson_read.htmlを作成し、ブラウザで読み込んでも同じ動作をします。
こちらにdockerの記事を掲載しています。よろしければ。

json_read.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>battonと記事</p>

    <script>
        const json_text = `
            {
                "name": "batton",
                "age": 43,
                "gender": "man",
                "active": true,
                "article": [
                    {
                        "title": "Docker Desktopが便利だった",
                        "length": 3108,
                        "active": true
                    },
                    {
                        "title": "よく使うdocker-composeコマンド、まとめ",
                        "length": 4374,
                        "active": false
                    },
                    {
                        "title": "Dockerfileでコンテナ破壊しほうだい",
                        "length": 2885,
                        "active": true
                    }
                ]
            }
        `;
	
        // json_textの型を確認します
        console.log(`json_textの型は${typeof json_text}`);

    </script>
</body>
</html>

console.log()を使って型(typeof)を確認してみました。

  • json_textはstringと判定されました。

疑問があります

json_textにはjsonを記載しています。しかし、型判定はstring(文字列)となりました。
どうしてだろうと思い、google先生に聞こう・・・あ、聞くまでもありませんでした。

json_textはバッククオートで囲んだ、ただの文字列でした。自分ではjsonを定義している!と、勘違いしていました。

変数に文字列を代入している。だけでした。

※バッククオートで囲んで複数行対応していますがただの文字列です。

どうしたらjsonになれるんだ?

公式のマニュアルを引用

JSON.parse() メソッドは文字列を JSON として解析し、文字列によって記述されている JavaScript の値やオブジェクトを構築します。

文字列からjsonに変換します。
早速JSON.parseを使います。
json_read.htmlを書き換えます。

json_read.html
// json_textの型を確認します
console.log(`json_textの型は${typeof json_text}`);

// json_textの文字列をjsonオブジェクトに変換します
const json_obj = JSON.parse(json_text);

// json_objの型を確認します
console.log(`json_objの型は${typeof json_obj}`);

json_obj変数を定義し、json_textをJSON.parseで変換します。
json_objの型判定はobjectとなり、無事jsonに変換することができました。

jsonの値をブラウザに表示してみよう

json_read.htmlを書き換えます。

json_read.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>battonと記事</p>
    <p id="batton_name">名前:</p>
    <p id="batton_age">年齢:</p>
    <p id="batton_gender">性別:</p>
    <p id="batton_active">生死:</p>

    <script>
        const json_text = `
            {
                "name": "batton",
                "age": 43,
                "gender": "man",
                "active": true,
                "article": [
                    {
                        "title": "Docker Desktopが便利だった",
                        "length": 3108,
                        "active": true
                    },
                    {
                        "title": "よく使うdocker-composeコマンド、まとめ",
                        "length": 4374,
                        "active": false
                    },
                    {
                        "title": "Dockerfileでコンテナ破壊しほうだい",
                        "length": 2885,
                        "active": true
                    }
                ]
            }
        `;

        // json_textの型を確認します
        console.log(`json_textの型は${typeof json_text}`);

        // json_textの文字列をjsonオブジェクトに変換します
        const json_obj = JSON.parse(json_text);

        // json_objの型を確認します
        console.log(`json_objの型は${typeof json_obj}`);

        // html要素を取得します
        const elem_batton_name = document.getElementById('batton_name');
        const elem_batton_age = document.getElementById('batton_age');
        const elem_batton_gender = document.getElementById('batton_gender');
        const elem_batton_active = document.getElementById('batton_active');

        // jsonオブジェクトの値をブラウザ画面に出力してみます
        elem_batton_name.textContent += json_obj.name;
        elem_batton_age.textContent += json_obj.age;
        elem_batton_gender.textContent += json_obj.gender;
        elem_batton_active.textContent += json_obj.active;

    </script>
</body>
</html>


json_read.htmlへアクセスするとjsonの値が表示されます。

jsonの使い方

jsonはkeyと呼ばれる識別子とvalueと呼ばれる値がペアになったデータ構造となります。

elem_batton_name.textContent += json_obj.name;
↑
elem_batton_name.textContentにjson_objのname(key)のbatton(value)を代入しています。

jsonのkeyを指定するとペアの値(batton)を利用することが可能です。

何が便利なんだ?

例えばjson_textを利用してこのhtmlを出力してみましょう。

// json_textの型を確認します
console.log(`json_textの型は${typeof json_text}`);

// json_textをそのまま利用します
//const json_obj = JSON.parse(json_text);

// json_objの型を確認します
// console.log(`json_objの型は${typeof json_obj}`);

// html要素を取得します
const elem_batton_name = document.getElementById('batton_name');
const elem_batton_age = document.getElementById('batton_age');
const elem_batton_gender = document.getElementById('batton_gender');
const elem_batton_active = document.getElementById('batton_active');

// jsonオブジェクトの値をブラウザ画面に出力してみます
// elem_batton_name.textContent += json_obj.name;
// elem_batton_age.textContent += json_obj.age;
// elem_batton_gender.textContent += json_obj.gender;
// elem_batton_active.textContent += json_obj.active;

// json_textを利用するので、key/valueで扱うことができなくなりました
// その為、文字列を引っ張ってきて代入します
elem_batton_name.textContent += json_text.substring(40,46);
elem_batton_age.textContent += json_text.substring(72,74);
elem_batton_gender.textContent += json_text.substring(103,106);
elem_batton_active.textContent += json_text.substring(135,139);


json_objと同じデータを表示することができました。

では、nameのbattonをbatton1に変えてjson_read.htmlにアクセスしてみましょう。

"name": "batton","name": "batton1",


batton1に変更したはずがbattonのまま表示されています。
他のデータも正常に表示されてなくなってしました。

json_textは文字列で定義されています。その為、substringを用いて開始/終了を指定し文字列を取得しています。
1文字でもずれてしまうと開始/終了地点がズレてしまう為、意図した値を取得できなくなってしまいます。

それでは、元に戻してjson_read.htmlへアクセスしてみましょう。


batton → batton1に無事に変更され、表示されるようになりました。
他の値も正常に表示されています。

ありがとうございます。

ご意見、ご批判頂ければ幸いです。

Discussion