『JSON入門』JSONとは、バリディーション、パースしてみる

JSON-データ記述言語 JSON

ここではJSONの基礎を学び、バリデーション(検証)、Pythonを例にJSONをパース(解析)する方法について記載します。

この記事は初心者の方向けの内容になり、この記事でJSONのイメージを付けて頂きたいと思います。

JSONスキーマについても簡単に記載していますが、JSONスキーマについては今後別の記事でまとめたいと思います。

 

JSONとは

JSONについて以下に箇条書きで特徴を記載します。

・JSONはRFCに準拠しています。
 >2006年に「RFC 4627」、2014年に改定され 「RFC 7159」 が公開。
 >2017年に更に改定され 「RFC 8259」 、「IETF STD 90」、「ECMA-404 2nd Editon」 が現時点で最新の仕様として公開されています

・JSONはJavaScript Object Notation(JavaScriptオブジェクト記法)の略で、テキストベースのデータフォーマットになります。
 名前の由来の通りJSONはJavaScriptのサブセットになるが、JavaScriptでの利用に限ったものではありません。

・言語に依存しないデータ交換ができます。

・XMLと比べると簡潔に構造化されたデータを記述できるため、記述が容易で人間が理解しやすいデータフォーマットとなっています。

・これまで共通データ定義言語としてXMLが利用されていたが、現在は簡易的なJSONが利用されるケースが増えています。

・JSONを利用することで冗長なXMLと比べて通信時のデータ量を削減できるなどのメリットもあります。

・一般的にウェブアプリケーションでデータの転送に使われています。

・JSONと比較されるフォーマットにYAMALがあります。

・文字コードは UTF-8 になります。

・MIMEタイプは application/json になります。

・拡張子は .json になります。

・コメントは記述できません。

・末尾のカンマ(ケツカンマとも言うそうです)は使えません。
 JavaScriptでは使えるが、IEではエラーになるようです。

{
  "name": "rokka",
  "age": 2,            <- この最後にあるカンマ
}
 

 

JSONの文法

{ ... } の中に、ダブルクォーテーション( " )で囲んだ変数名と値をコロン( : )で区切って記載します。

左側の変数名のことをキーやプロパティと言います。ここではキーとします。

また、キーと値のペアをメンバーと言います。

{ "キー": 値 }
{ "name": "rokka" }

 

キーと値のセットを複数指定する場合は、カンマ( , )で連結します。

{ "キー": 値, "キー": 値 }
{ "name": "rokka", "age": 2 }

 

キーや文字列の値はシングルクォーテーション( ' )は使えません

 

読みやすくするために、改行とインデントを付けることもできます。インデントは半角スペース2つか4つが多く使われます。

{
  "name": "rokka",
  "age": 2
}
 

 

JSONの型

文字列 "..."
数値 10進数、指数表記(8進数、16進数は使えない)
123, -123, 123.4, 1,23e4 など
真偽値 true, false
ヌル文字 null
配列 [...]
オブジェクト {...}

 

文字列

文字列はダブルクォーテーション( " )で囲みます。

{ "name": "rokka" }

 

以下のエスケープシーケンスを使用できます。

\" ダブルクォーテーション(")
\\ バックスラッシュ(\)
\/ スラッシュ(/)
\b バックスペース
\f フォームフィード
\n ラインフィード
\r キャリッジリターン
\t タブ
\uXXXX Unicode文字

 

数値

123といった数値を指定します。

扱える最大値はJSONの仕様に定義されていません。IEEE754の64ビット倍精度が広く実装されているため、その範囲での実装を進めているようです。

倍精度浮動小数点数で正確に表現できる整数の範囲は、-(2の53乗-1) から 2の53乗-1(-9007199254740991 ~ 9007199254740991)の精度を扱うことができます。

浮動小数の場合は、仮数部53ビット(10進数で15~16桁)、指数部11ビット(10進数で-1022~+1023)の精度を扱うことができます。

{
  "age": 2,
  "foot_size": 3.5
}
 

 

真偽値

真偽をtrueまたは、falseで指定します。trueとfalseは全て小文字です。

 
{
  "dress": true,
  "shoes": false
}

 

ヌル値

値がないことを示すにはnullを指定します。nullは全て小文字です。

{ "name": null }

 

オブジェクト

オブジェクトを{...}で指定します。オブジェクトは階層構造で指定することができます。

{
  "user_info": {
    "name": "rokka",
    "password": "123abc"
  }

}

これを見てわかる通り、JSONデータ自体がオブジェクトになります。

JSONのオブジェクトはPythonで言うディクショナリー(辞書)と同じです。

 

配列

配列は[...]で指定します。配列の要素には文字列、数値、真偽値、ヌル値、オブジェクトの全てを指定することができます。

{
  "color_list": ["red", "blue", "green"],
  "color_num": ["111", "222", "333"],
  "user_list": [
    { "name": "rokka", "age": 2 },
    { "name": "sora", "age": 11 },
  ]

}

 

JSONの記述が正しいかをチェックする方法(バリデーション)

JSONを書いたは良いが、最初の内は正しく書けているのか、間違っていてもどこが間違えているのかが分からないと思います。

JSONが正しいデータフォーマットで記述できているのか、構文チェックを行うことをvalitation(バリデーション)などと呼び、オンラインでバリデーションを行うことができます。

また間違えている場合は、場所も特定できるようになっています。

今回は以下のサイトを紹介しますが、ほかにも良いサイトがありますので、自分に合ったサイトを探してみてください。

JSONデータのバリデーションと整形まで行ってくれます。
JSON Editer Online

JSONスキーマでJSONデータのバリデーションを行う場合。
JSON Schema validation online

 

JSONスキーマとは

JSONスキーマの仕様は「json-schema-org」で策定されています。2019年7月時点での最新仕様は「Draft-07になります。

ここでは簡単な説明をします。また別の記事でまとめたいと思います。m(_ _)m

JSON形式のデータが、あらかじめ決められたルールを守って書かれているかをチェックしたい場合に、JSONスキーマという規格が策定されています。

JSONスキーマでは、バリデーション対象のJSON形式のデータのことをJSONインスタンスと呼びます。

JSONスキーマ自体もJSON形式で記述します。

何も制約しない場合は空のJSONオブジェクトを指定します。

{}

 

ここでは簡単なJSONスキーマとJSONインスタンス(JSONデータ)を用意しました。

[JSONスキーマ]

{
  "type": "object",
  "properties": {
  "name": { "type": "string" },
  "age": { "type": "integer", "minimum": 0 }
  },
  "required": ["name"]
}

 

[JSONインスタンス]

{
  "name": "rokka",
  "age": 2
}

このデータとスキーマを「JSON Schema validation online」でバリーでションすると成功します。

しかし、"age"の値を-1にすると、エラーになることが分かります。

この例で言うと、JSONスキーマで以下のような制約を設けているからです。

・"name"キーの値は文字列とする。
・"age"キーの値は数値とする。
・"age"キーの値はは0以上とする。
・"name"キーと値のペアは必須とする。

 

JSONをパースする方法(Python3編)

JSONはウェブアプリケーションでデータのやりとりを行う際によく使われるデータ形式です。記述が簡易的とはいえデータ量が多くなると読みづらくなります。そこでパース(解析)をする必要があります。

ここではPythonを例にJSONをパースする方法について記載します。

 

JSONデータの読み込み

PyhonでJSONデータをパースするには、JSONデータを辞書型として読み込む必要があり、JSONデータを読み込む方法は大きく分けて2種類あります。

 

JSONファイルから辞書型に変換して読み込む

JSONモジュールのload関数を使うことで、JSONファイルとして保存されているデータを読み込むことができます。

今回は例として以下の「doglist.json」というJSONファイルのパースを行います。

jsonモジュールをインポートします。JSONファイルは普通のファイルのオープンと同様で、open関数で開きます。

開いたJSONファイルのファイル変数をload関数の引数に渡すことで、JSONファイルを読み込むことができます。load関数で読み込んだJSONファイルは辞書型で返します。

print関数ではtypeを出力しています。結果から辞書型で保存されていることが確認できます。

 

JSON形式で書かれた文字列を辞書型に変換して読み込む

loads関数を使うことで、JSON形式で書かれた文字列を辞書型に変換して読み込むことができます。

loads関数は、引数にJSON形式の文字列を渡すことで、辞書型に変換して返します。

print関数ではtypeを出力しています。結果から辞書型で保存されていることが確認できます。

 

必要なデータ(メンバー、値)を取り出す

JSONデータの読み込みが出来たら、パース(解析)を行います。load関数または、loads関数ですでに辞書型に変換されているので、Pytnonの辞書型と同じ扱いでデータを取得することができます。

ここでは、通常の辞書型のようにキーを指定して値を取り出しています。辞書型のメソッドを使ったり、for文で取り出すことも出来ます。

 

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