JSONの構造

JSONJava Script Object Notationの略で、データ構造を表現できるフォーマット。Rubyを含めさまざまな言語で扱うことができ、Web APIなどでよく利用されている。拡張子は.json

データ型は6種類

JSONのデータ型は以下の6つだけ。

データ型 書式
オブジェクト {「名前」:「値」, 「名前」:「値」}
配列 [配列]
文字列 "文字列"
数値 1など
ブーリアン true または false
null null

オブジェクトは、{}で囲まれていて、「名前」(プロパティ名ともいう)と「値」のセットであるメンバを持つ。Rubyでいうハッシュのような形。

VSCodeの設定ファイル(settings.json)を例として見てみる。

<settings.json> 一部抜粋

{
    "editor.fontSize": 13,
    "editor.tabSize": 2,
    "hediet.vscode-drawio.local-storage": {
        ".drawio-config": {
            "libraries": "general;uml;er;bpmn;flowchart;basic;arrows2",
            "customLibraries": [
                "L.scratchpad"
            ],
            "plugins": [],
            "formatWidth": "240",
            "createTarget": false,
            "pageFormat": {
                "x": 0,
                "y": 0,
                "width": 827,
                "height": 1169
            },
            "search": true,
            "showStartScreen": true,
            "gridColor": "#d0d0d0",
            "darkGridColor": "#6e6e6e",
            "autosave": true,
            "resizeImages": null,
            "unit": 1,
            "isRulerOn": false,
        }
    },
    "files.associations": {
        "*.erb": "erb"  
    },
    "diffEditor.ignoreTrimWhitespace": false
}

まず全体が一つのオブジェクトであり、editor.fontSizeeditor.tabSizehediet.vscode-drawio.local-storagefiles.associationsdiffEditor.ignoreTrimWhitespaceという5つのメンバを持っている。メンバ間はコンマ,で区切られる。

このeditor.fontSizeeditor.tabSizeが「名前」であり、コロン:で区切られた右側の132が「値」である。

「名前」は文字列でないとNG

よく見ると、:の左側の「名前」(プロパティ名)は全て"で囲まれた文字列であることがわかる。

対して、:右側の「値」は、配列や文字列、数値、truefalsenull、そして{ }で囲まれるオブジェクトまでいろいろな値が入っている。

メンバの「値」は6つの型のいずれでもOKだが、「名前」は文字列でなければならないのだ。

メンバとプロパティの違い??

この記事を書くにあたり、メンバとプロパティという用語が同じように使われていて混乱したので少し調べた。

JavaScriptでは、オブジェクトが持つデータや機能のことを「メンバ」という。それが関数であればメソッド、データであればプロパティと呼ぶのだが、JSONはメソッドを持てないので、メンバ=プロパティと言っても問題がないようだ。

そういうわけで、JSONのメンバの名前のことをプロパティ名、値のことをデータと呼んだりもするが、特に気にしなくていいということで安心した。

(参考)[JavaScript] オブジェクトの基礎 - Qiita


(参考サイト)JSON データの操作 - ウェブ開発を学ぶ | MDN

(参考書籍)Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus