雑記
 

JSONの仕様

2020/3/20

目次

1.JSONの概要

JSON(ジェイソン)はテキストベースのデータを表現する形式です。軽量で扱いやすいため、2020年現在ではプログラミング言語やプラットフォームの枠を超えて共通で使用されています。

この記事ではVBやC#などの言語に依存せず、純粋なJSONの仕様を説明します。VBやC#を使ってJSONを読み込む方法は VB/C#でJSONの読み込み(JSON.NET編) で説明しています。

JSONはRFC 8529ECMA-404で標準化されています。両者は文章は異なりますが定義している内容は同じです。この記事では出典をRFC 8529に基づいて示します。JSONの仕様は短いので、RFCをちゃんと読んで見たことない方には、直接読んでみる練習をするのに良いかもしれません。

JSLintのWebサイトは文字列がJSONとして正しいか簡単に判定してくれるので、JSONを勉強したりデバッグしたりする場合に便利です。

JSONの例

{
    "Image": {
        "Width": 800,
        "Height": 600,
        "Title": "View from 15th Floor",
        "Thumbnail": {
            "Url": "http://www.example.com/image/481989943",
            "Height": 125,
            "Width": 100
        },
    "Animated" : false,
    "IDs": [116, 943, 234, 38793]
    }
}

 

 

基本構造

JSONは オブジェクト、配列、数値型、文字列型、または3つのリテラル名のどれかで表現されます。(RFC8259 3)

オブジェクト { } で囲んで表現します。
配列 [ ] で囲んで表現します。
数値型 基本的には数字で表現します。 - や 指数表記も可能です。(RFC8259 6)
文字列型 " " で囲んで表現します。
3つのリテラル false true null のことです。※すべて小文字(RFC8259 3)

なお、false と true の型を「論理型」と表現します。

次の例はすべて有効なJSONです。どれもとても短い例ですが、これだけで完全なJSONです。

JSONの例:空のオブジェクト


{ }

 

JSONの例:型の配列


[ ]

 

JSONの例:単一の数値


123

 

JSONの例:単一の文字列


"こんにちは"

 

JSONの例:単一のリテラルの例1


true

 

JSONの例:単一のリテラルの例2


null

 

配列

配列は [ ] で囲まれた0個以上の値です。複数の要素がある場合カンマで区切られます。同じ配列内でそれぞれの値が同じ型である必要はありません。(RFC8259 5)

[ ] と カンマの前後にはスペース・タブ・改行を記述することができます。(RFC8259 2)

次の例はすべてJSONとして有効な配列の例です。

JSONの例:配列1


[1]

JSONの例:配列2 改行をつけられます。

[
1
]

JSONの例:配列3


[1,2]

JSONの例:配列4


["あ"]

JSONの例:配列5


["あ", "い"]

JSONの例:配列6 上の例と内容は同じです。改行をつけて、スペースやタブで見やすく整えることができます。

[
    "あ",
    "い"
]

JSONの例:配列7


[1,"あ",true,"い"]

JSONの例:配列8

[
    1,
    "あ",
    true,
    "い"
]

配列には順序性があります。(RFC8259 1)

つまり、[1,2]と[2,1]は異なる配列です。JSONを扱うプログラムはJSON内の配列の順序を正しく解釈することが求められます。(一方、後述するオブジェクトには順序性がなく対照的です。)

 

 

オブジェクト

オブジェクトは { } で囲まれたゼロ個以上の名前と値のペアです。名前と値は : で区切ります。名前は必ず文字列で表現します。つまり名前は必ず " " で囲む必要があります。(RFC8259 4)

名前と値のペアを複数記述する場合は、カンマで区切ります。同じオブジェクトの中では名前はユニークである必要があります。 (RFC8259 4)

{ } とカンマの前後にはスペース・タブ・改行を記述することができます。(RFC8259 2)

JSONの例:オブジェクト1


{"Name":"rucio"}

JSONの例:オブジェクト2


{"Age":13}

JSONの例:オブジェクト3


{"Name":"rucio", "Age":13}

JSONの例:オブジェクト4

{
    "Name":"rucio",
    "Age":13
}

オブジェクトの個々の 名前と値の ペアには順序性はありません。(RFC8259 1)

つまり {"A":1, "B":2} と {"B":2, "A":1}は同じ意味のオブジェクトです。JSONを扱うプログラムはJSON内のオブジェクトの順序を記載されている通りに扱うことは求められていません。

 

オブジェクトと配列の組み合わせ

オブジェクトの値は 文字列型・数値型・論理型・nulll、オブジェクト、配列のどれかです。(RFC8259 1)

そのため配列を値とするオブジェクトを記述できます。

JSONの例:配列を値とするオブジェクト

{
    "Team" : "ProjectA",
    "Member": ["伊藤博文", "黒田清隆", "三条実美", "山県有朋"]
}

オブジェクトを値とするオブジェクトも記述できます。結果としてオブジェクトが入れ子構造になります。

JSONの例:オブジェクトを値とするオブジェクト

{
    "Team" : "ProjectA",
    "Leader": {
        "Name":"安倍信三",
        "Party":"自由民主党"
    }
}

 

配列の値にも同じようにオブジェクトや配列を使用することができます。

JSONの例:オブジェクトを値とする配列

[
    {"Name":"伊藤博文", "Party":"(長州)"},
    {"Name":"黒田清隆", "Party":"(薩摩)"},
    {"Name":"三条実美", "Party":"(公家)"},
    {"Name":"山県有朋", "Party":"(長州)"}
]

 

文字列のエスケープ

引用符・バックスラッシュ・制御文字(U+0000からU+001F)はエスケープで表現する必要があります。

この範囲の制御文字でよく使われるのはタブと改行です。

エスケープするにはそれぞれの文字の前にバックスラッシュを記述するか、\t(タブ)、\r\n(改行)などの多くのプログラミング言語で使用されている伝統的な方法を使用します。

バックスラッシュは多くの日本語のフォントでは円マークです。

JSONの例:引用符のエスケープ


{"Cite":"He said \"sure.\""}

JSONの例:改行のエスケープ


{"Sentence":"これが1行目です。\r\nこれが2行目です。"}

 

エスケープシーケンス \u を使ってUnicode文字をUnicodeのコードポイントで表現することもできます。

 

その他

JSON全体はUTF-8でエンコードされている必要があります。(RFC8259 8)

HTTPで送受信する場合のContent-Typeヘッダーなどで使用されるメディアタイプは application/json です。(RFC8259 11)