【詳細②】JSON:システム同士の共通語を、仕様書で正確に理解する

JSONとは

 JSONは、データを「名前と値のペア」として書く形式です。
 仕様書(RFC 8259)は、軽くて、文字だけで書けて、特定のプログラミング言語に依存しない、データ交換用の形式だと説明しています [J1]。
 インターネットの標準として正式に決められており、別の団体(Ecma)の規格(ECMA-404)でも同じ決まりが書かれています [J1]。

JSONで表せる情報は、以下の例文にあるような6種類だけです [J1]。

  • 文字列:”hoge” のように、引用符で囲んだ文字
  • 数値:30 や 3.14 など
  • 真偽値:true(はい)か false(いいえ)
  • null:「値がない」ことを表す
  • オブジェクト:名前と値のペアをまとめたもの({ } で囲む)
  • 配列:値を順番に並べたもの([ ] で囲む)
{
  "name": "hoge",
  "age": 30,
  "active": true,
  "tags": ["data", "json"],
  "address": null
}

つまずきやすい点を、仕様書で確認する

① コメントは書けない

 JSONの仕様で「書いてよい」とされている空白は、スペース・タブ・改行だけです。メモを書き込むための記法は、仕様にありません [J1]。
 メモを残したい設定ファイルにJSONを使うと、困ることがあります。

② 同じ名前を2回書かない

 1つのオブジェクトの中では、名前をかぶらせないほうがよい(望ましい)とされています。

 もしかぶった場合の動きは決まっておらず、後ろの値だけを採用するソフト、エラーにするソフト、全部を残すソフトがあると仕様書に書かれています [J1]。
 順番に頼った処理も、ソフトによって扱いが違うため、避けたほうが安全です [J1]。

③ 数字には決まりがある

  • 007 のように、先頭にゼロを付けることはできない。NaN(数ではない)や Infinity(無限大)などの非数も使えない [J1]
  • ソフトによっては、扱える数の大きさや細かさに限りがある。多くのソフトが使う仕組みで、確実に同じ値として扱える整数は、おおよそプラスマイナス9,007兆(正確には9,007,199,254,740,991)までとされている [J1]

 とても大きな番号(IDなど)を、数値としてJSONに書くときは、この範囲を超えていないか確認が必要です。
 超えると、受け取るソフトによって値がずれる可能性があります。

④ 文字コードはUTF-8

 文字コードとは、文字をコンピューター上の数字に置き換える決まりのことです。
 別々のシステム間でやり取りするJSONは、UTF-8という文字コードで書かなければならない、と仕様書は定めています [J1]。

 また、ファイルの先頭に付く「目に見えない目印」(BOM、ビーオーエム)は、ネットワークで送るJSONには付けてはいけません。
 受け取る側は、付いていても無視してかまわない、とされています [J1]。

⑤ 特別な文字は書き方が決まっている

 文字列の中で、引用符(”)、バックスラッシュ(\)、改行などの目に見えない制御文字を使うときは、決められた特別な書き方(たとえば \” や \n)にする必要があります [J1]。

いちばん外側は、何でもよい

 現在の仕様では、JSONのいちばん外側は、数値や文字列だけでもかまいません。
 ただし、昔の仕様では「オブジェクトか配列」に限られていたため、古いソフトとの相性を考えると、オブジェクトか配列にしておくのがいちばん確実だと説明されています [J1]。

ファイルの種類を示すラベルと拡張子

 JSONのラベル(メディアタイプ)は application/json、拡張子は .json です [J1]。

安全のために:JSONはプログラムとして実行しない

 JavaScriptには、文字をそのままプログラムとして実行する機能(eval)があります。
 これでJSONを読み込むと、中にプログラムが紛れ込んでいた場合に、勝手に実行されてしまう危険があります。

 仕様書は、これを一般に許容できないリスクだと警告しています [J1]。JSONは、専用の読み込み機能で読み込むのが基本です。

JSON Lines(JSONL):1行に1件ずつ書く形式

 件数が多いデータには、以下の例文のようなJSON Linesという形式が向いています。
 公式サイトによると、守る条件は3つです。

  • UTF-8で書くこと
  • 各行が正しいJSONの値であること
  • 行の区切りが改行であること
{"time":"2026-10-08T09:00:00Z","level":"info","msg":"started"}
{"time":"2026-10-08T09:00:05Z","level":"warn","msg":"slow query"}

 拡張子は .jsonl が推奨されています [J2]。
 1件ずつ順番に処理する用途や、ログの保存に向いていると説明されています [J2]。

注記:JSON Linesは、コミュニティが運営するサイト(jsonlines.org)が定めた書き方で、
   IETFなどの標準ではありません。
   同サイトは別名として「newline-delimited JSON(改行区切りのJSON)」を挙げていますが、
   NDJSONという名前の別の仕様との違いは、今回は確認していません [J2]。

参照元

[J1] IETF, RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format — https://datatracker.ietf.org/doc/html/rfc8259

[J2] JSON Lines — https://jsonlines.org/

総集編へ戻る

コメント

タイトルとURLをコピーしました