JSON(JavaScript Object Notation、発音は/ ˈdʒeɪsən /または/ ˈdʒeɪˌsɒn /)は、名前と値のペアや配列(またはその他のシリアル化可能な値)で構成されるデータオブジェクトを保存および送信するために人間が読めるテキストを使用する、オープン標準のファイル形式およびデータ交換形式です。これは、 Webアプリケーションとサーバーを含む電子データ交換において多様な用途を持つ、一般的に使用されているデータ形式です。
JSONはプログラミング言語に依存しないデータ形式です。JavaScriptから派生しましたが、多くの最新のプログラミング言語にはJSON形式のデータを生成および解析するコードが含まれています。JSONファイル名には拡張子.json.
ダグラス・クロックフォードは2000年代初頭にJSONフォーマットを最初に規定した。[ 1 ]彼ら[ a ]とチップ・モーニングスターは2001年4月に最初のJSONメッセージを送信した。
2017年の国際規格(ECMA-404およびISO/IEC 21778:2017)では、「JSON」は「 『アルゴ探検隊の大冒険』のジェイソンのように/ ˈ dʒ eɪ . s ə n /と発音する」と規定されている。[ 3 ] [ 4 ] ECMA-404の最初の版(2013年)では、発音については触れられていなかった。[ 5 ]クロックフォードは2011年に「その発音については多くの議論があるが、私は全く気にしない」と述べている。[ 1 ] / ˈ dʒ eɪ ˌ s ɒ n /は別の一般的な発音である。[ 6 ]
RFC 4627 が 2006 年以来「情報」仕様として利用可能であった後、JSON は 2013 年にECMA -404 として初めて標準化されました。[ 5 ] 2017 年に公開された RFC 8259 は、インターネット標準STD 90の最新バージョンであり、ECMA-404 と整合性を保っています。[ 7 ]同年、JSON はISO/IEC 21778:2017 としても標準化されました。[ 3 ] ECMAおよびISO/IEC規格は許可される構文のみを記述していますが、RFC はセキュリティと相互運用性に関する考慮事項の一部をカバーしています。[ 8 ]

JSONは、2000年代初頭に主流だったFlashやJavaアプレットなどのブラウザプラグインを使用せずに、リアルタイムのサーバーとブラウザ間のセッション通信プロトコルが必要になったことから生まれた。 [ 9 ]
クロックフォードは最初にJSON形式を定義し、普及させた。[ 1 ]この頭字語は、クロックフォードらが2001年3月に共同設立したState Software社で生まれた。共同設立者たちは、標準的なブラウザ機能を使用し、Web開発者がステートフルなWebアプリケーションを作成するための抽象化レイヤーを提供するシステムを構築することに合意した。このアプリケーションは、2つのHypertext Transfer Protocol(HTTP)接続を開いたままにして、それ以上のデータが交換されない場合は標準的なブラウザのタイムアウト前にそれらを再利用することで、Webサーバーへの永続的な双方向接続を持つ。共同設立者たちは円卓会議を開き、データ形式をJSML(JavaScript Markup Language)と呼ぶかJSON(JavaScript Object Notation)と呼ぶか、また、どのようなライセンスタイプで提供するかについて投票した。JSON.org [ 10 ] Webサイトは2001年に開設された。2005年12月、Yahoo!は一部のWebサービスをJSONで提供し始めた。[ 11 ]
JSONライブラリの前身は、Communities.comのCartoon Orbitという子供向けデジタル資産取引ゲームプロジェクトで使用されていました。このゲームでは、独自のメッセージング形式を持つブラウザ側のプラグインを使用してDHTML要素を操作していました。初期のAjax機能が発見されると、digiGroups、Nooshなどは、Webアプリケーションの視覚コンテキストを更新することなく、フレームを使用して情報をユーザーのブラウザの視覚フィールドに渡すことで、Netscape 4.0.5以降とInternet Explorer 5以降の標準HTTP、HTML、JavaScript機能のみを使用してリアルタイムのリッチWebアプリケーションを実現しました。その後、Crockfordは、JavaScriptがそのようなシステムのオブジェクトベースのメッセージング形式として使用できることを発見しました。このシステムは、Sun Microsystems、Amazon.com、EDSに売却されました。
JSONはJavaScriptスクリプト言語のサブセット(具体的には、標準ECMA -262第3版—1999年12月[ 12 ] )に基づいており、JavaScriptでよく使用されますが、言語に依存しないデータ形式です。JSONデータの解析と生成のためのコードは、多くのプログラミング言語で容易に入手できます。JSONのWebサイトでは、言語別にJSONライブラリが一覧表示されています。
2013 年 10 月、Ecma International はJSON 標準 ECMA-404 の初版を公開しました。[ 5 ]同年、RFC 7158はECMA-404 を参照として使用しました。2014 年、RFC 7159 はJSON のインターネット利用における主要な参照となり、RFC 4627とRFC 7158に取って代わりました(ただし、ECMA-262 と ECMA-404 は主要な参照として維持されました)。2017 年 11 月、ISO/IEC JTC 1/SC 22は ISO/IEC 21778:2017 [ 3 ]を国際標準として公開しました。2017 年 12 月 13 日、インターネット技術タスク フォースは、インターネット標準STD 90の現行バージョンであるRFC 8259を公開し、 RFC 7159 を廃止しました。 [ 7 ]
クロックフォードは、企業弁護士や過度に理屈っぽい人々を揶揄しつつJSONライブラリをオープンソース化するために、JSONライセンスに「ソフトウェアは善のために使用され、悪のために使用されてはならない」という条項を追加した。一方で、オープンソースソフトウェアやフリーソフトウェアは通常、使用目的に制限がないことを意味するため、この条項はJSONライセンスと他のオープンソースライセンスとのライセンス互換性の問題を引き起こした。[ 13 ]
以下の例は、人物を記述するJSON表現の一例を示しています。
{ "first_name" : "John" , "last_name" : "Smith" , "is_alive" : true , "age" : 27 , "address" : { "street_address" : "21 2nd Street" , "city" : "New York" , "state" : "NY" , "postal_code" : "10021-3100" }, "phone_numbers" : [ { "type" : "home" , "number" : "212 555-1234" }, { "type" : "office" , "number" : "646 555-4567" } ], "children" : [ "Catherine" , "Thomas" , "Trevor" ], "spouse" : null }Crockford は当初 JSON はJavaScriptとECMAScriptの厳密なサブセットであると主張したが、[ 14 ]実際にはその仕様では有効な JSON ドキュメントが有効な JavaScript ではないことが許容されている。JSON ではUnicode の行区切り文字U+2028 LINE SEPARATORとU+2029 PARAGRAPH SEPARATOR が引用符付き文字列内でエスケープされずに表示されるが、ECMAScript 2018 以前ではそうではない。[ 15 ] [ 16 ]これは JSON が「制御文字」のみを許可しないことの結果である。最大限の移植性を確保するため、これらの文字はバックスラッシュでエスケープされる。
オープンなエコシステムにおける JSON 交換はUTF-8でエンコードする必要があります。[ 7 ]このエンコードは、基本多言語面(U+0000 ~ U+FFFF)外の文字を含む、完全なUnicode文字セットをサポートしています。ただし、エスケープされた場合は、これらの文字は UTF-16 サロゲート ペアを使用して記述する必要があります。たとえば、絵文字 U+1F610 😐 NEUTRAL FACE を JSON に含めるには、次のように記述します。
{ "face" : "😐" }または:
{ "face" : "\uD83D\uDE10" }JSONは、2019年のECMAScript改訂以降、ECMAScriptの厳密なサブセットとなった。[ 16 ] [ 17 ]
JSONの基本的なデータ型は以下のとおりです。
trueまたはfalsenull: 空の値、単語を使用null構文要素(値と句読点、ただし文字列値内ではない)の周囲または間には空白文字が許可され、無視されます。この目的のために、4 つの特定の文字が空白文字とみなされます。スペース、水平タブ、改行、キャリッジリターンです。特に、バイトオーダーマークは準拠実装によって生成されてはなりません(ただし、JSON を解析する際には受け入れられる場合があります) 。JSON はコメントの構文を提供しません。[ 20 ]
JSONの初期バージョン( RFC 4627などで規定されていたものなど)では、有効なJSONテキストはオブジェクト型または配列型のみで構成され、その中に他の型を含めることができるという制約がありました。この制約はRFC 7158で撤廃され、JSONテキストは任意のシリアル化された値として再定義されました。
JSON の数値は、プログラミング言語内での表現方法に依存しません。これにより、任意の精度の数値をシリアル化できますが、移植性の問題が発生する可能性があります。たとえば、整数値と浮動小数点値の区別がないため、一部の実装では42、、、42.0およびを同じ数値として扱う場合もあれば、そうでない場合もあります。JSON 標準では、オーバーフロー、アンダーフロー、精度の損失、丸め、符号付きゼロ4.2E+1などの実装の詳細に関する要件はありませんが、「良好な相互運用性」のために、 IEEE 754 binary64精度を超える精度を期待しないことを推奨しています。浮動小数点数のマシン レベルのバイナリ表現 (binary64 など) を人間が読める 10 進数表現 (JSON の数値など) にシリアル化して元に戻す際に、本質的に精度が失われることはありません。この変換を正確かつ最適に行うための公開されたアルゴリズムが存在します。[ 21 ]
JSONからコメントは意図的に除外されました。2012年にダグラス・クロックフォードは、その設計上の決定について次のように説明しています。「JSONからコメントを削除したのは、人々がコメントを解析指示を保持するために使用しているのを見たからです。そのような行為は相互運用性を損なうものでした。」[ 20 ]
JSONでは、データ構造内の最後の値の後に続く「末尾のカンマ」は許可されていません。[ 22 ]末尾のカンマは、使いやすさを向上させるためにJSON派生の一般的な機能です。[ 23 ]
RFC 8259 では、JSON構文の特定の側面について説明されており、それらは仕様上は合法であるものの、相互運用性の問題を引き起こす可能性がある。
2015年、IETFはRFC 7493を公開し、「I-JSONメッセージフォーマット」について説明した。これはJSONの制限付きプロファイルであり、JSONの構文と処理を制約することで、これらの相互運用性の問題が可能な限り回避されるようにしている。
JSONはデータ交換のための構文フレームワークを提供するが、曖昧さのないデータ交換には、JSON構文の特定の使用法の意味論についてプロデューサーとコンシューマーの間で合意することも必要である。[ 24 ]このような合意が必要となる例の1つは、JSON標準の一部ではないデータ型(たとえば、日付や正規表現)のシリアル化である。
JSON テキストの公式MIME タイプapplication/jsonは であり、[ 25 ]ほとんどの最新の実装ではこれを採用しています。従来の MIME タイプにはtext/json、text/x-json、 および がありますtext/javascript。[ 26 ] 標準のファイル名拡張子は .json です。[ 27 ]
JSON Schema は、検証、ドキュメント作成、およびインタラクション制御のための JSON データの構造を定義する JSON ベースのフォーマットを規定します。特定のアプリケーションが必要とする JSON データと、そのデータを変更する方法に関する契約を提供します。[ 28 ] JSON Schema はXML Schema (XSD)の概念に基づいていますが、JSON ベースです。XSD と同様に、同じシリアル化/逆シリアル化ツールをスキーマとデータの両方に使用でき、自己記述的です。IETFのインターネット ドラフトで規定されており、2024 年時点での最新バージョンは「Draft 2020-12」です。[ 29 ]さまざまなプログラミング言語に対応したバリデーターがいくつかあり、[ 30 ]それぞれ準拠レベルが異なります。
JSON標準はオブジェクト参照をサポートしていませんが、JSONベースのオブジェクト参照に関するIETFドラフト標準が存在します。 [ 31 ]
JSON-RPCは、 XML-RPCやSOAPに代わるものとして、JSONを基盤としたリモートプロシージャコール(RPC)プロトコルです。ごく少数のデータ型とコマンドのみを定義するシンプルなプロトコルです。JSON-RPCを使用すると、システムは通知(応答を必要としないサーバーへの情報)を送信したり、順不同で応答可能な複数の呼び出しをサーバーに送信したりできます。
非同期JavaScriptとJSON (AJAJ)とは、 Ajaxと同じ動的なWebページ生成手法を指しますが、データ形式がXMLではなくJSONです。AJAJは、 Webページがブラウザに読み込まれた後に新しいデータを要求できるようにするWeb開発技術です。通常、Webページ上でのユーザーの操作に応じて、サーバーから新しいデータを取得します。例えば、ユーザーが検索ボックスに入力した内容をクライアント側のコードがサーバーに送信し、サーバーは即座に一致するデータベース項目のドロップダウンリストを表示します。
JSON は設定言語としてアドホックに使用されてきました。しかし、コメントはサポートされていません。2012 年に JSON の作成者である Douglas Crockford は、設定言語として使用される JSON のコメントについて次のように述べています。「コメントがないことを残念に思う人もいるでしょうが、そうであるべきではありません。JSON を使用して設定ファイルを管理し、注釈を付けたいとします。好きなだけコメントを挿入してください。そして、それを JSMin [ 32 ]にパイプしてから、JSON パーサーに渡してください。」[ 20 ]
MongoDBは、ドキュメント指向データベースとしてJSONライクなデータを使用します。
一部のリレーショナルデータベースでは、PostgreSQLのJSONB [ 33 ]やMySQLのJSON [ 34 ]など、ネイティブJSONデータ型のサポートが追加されています。これにより、開発者はJSONデータを別の形式に変換することなく直接挿入できます。
JSON は JavaScript のサブセットであるため、JSON テキストを JavaScripteval()関数に渡しても安全であるという誤解が生じる可能性があります。これは安全ではありません。特定の有効な JSON テキスト、特にU+2028 LINE SEPARATORまたはU+2029 PARAGRAPH SEPARATORを含むテキストは、2019 年に JavaScript 仕様が更新されるまで有効な JavaScript コードではなかったため、古いエンジンではサポートされない可能性があります。[ 35 ]インターネットから任意のコードを実行することによって生じる多くの落とし穴を回避するために、新しい関数 がECMAScript の第 5 版に初めて追加されました。[ 36 ]これは 2017 年現在、すべての主要ブラウザでサポートされています。サポートされていないブラウザ向けには、 Douglas Crockfordによって API 互換の JavaScript ライブラリが提供されています。[ 37 ]さらに、TC39 の提案「Subsume JSON」により、2019 年の改訂版以降、ECMAScript は厳密な JSON のスーパーセットになりました。 [ 16 ] [ 17 ]さまざまな JSON パーサーの実装は、サービス拒否攻撃と大量代入の脆弱性の影響を受けています。[ 38 ] [ 39 ]JSON.parse()
JSONは、XMLの低オーバーヘッド代替手段として推奨されています。これは、これらのフォーマットが、実際に一般的に使用されている状況において、作成、読み取り、およびデコードに関して広くサポートされているためです。[ 40 ]特定のユースケースに応じて、JSONの代替手段には次のようなものがあります。
XML は、構造化データを記述し、オブジェクトをシリアル化するために使用されてきました。JSON と同じ種類のデータ構造を、同じ種類のデータ交換目的で表現するための、さまざまな XML ベースのプロトコルが存在します。データは、XML でいくつかの方法でエンコードできます。タグ ペアを使用する最も拡張的な形式では、JSON よりもはるかに大きな (文字数で) 表現になりますが、閉じタグが に置き換えられた属性と短いタグ/>形式でデータを格納すると、表現のサイズは JSON とほぼ同じか、わずかに大きくなるだけです。[ 43 ]ただし、XML 属性は単一の値しか持つことができず、各属性は各要素に最大で 1 回しか出現できません。
XMLは(要素と属性を用いることで)データとメタデータを分離するが、JSONにはそのような概念はない。
もう一つの重要な違いは、値のアドレス指定方法です。JSONでは、単純なキーと値のマッピングを持つオブジェクトが使用されますが、XMLでは、アドレス指定はノードで行われ、各ノードはXMLプロセッサによって一意のIDを受け取ります。さらに、XML標準では、xml:idユーザーがIDを明示的に設定するために使用できる共通属性が定義されています。
XMLタグ名には、文字、スペース文字を含めることができず、、、または数字で始めることもできませんが、JSONキーは可能です(引用符とバックスラッシュはエスケープする必要があります)。[ 44 ]!"#$%&'()*+,/;<=>?@[\]^`{|}~-.
XMLの値は文字列であり、型安全性は組み込まれていません。XMLにはスキーマという概念があり、これにより厳密な型付け、ユーザー定義型、事前定義タグ、形式的な構造が可能になり、XMLストリームの形式的な検証が可能になります。JSONにはいくつかの組み込み型があり、JSON Schemaという同様のスキーマ概念があります。
コメントやその他の機能のサポートは有用であると見なされており、その結果、いくつかの非標準JSONスーパーセットが作成されました。その中には、HJSON、[ 46 ] HOCON、およびJSON5(名前とは異なり、JSONの第5バージョンではありません)があります。[ 47 ] [ 48 ]
YAMLバージョン 1.2 は JSON の上位互換です。以前のバージョンは厳密には互換性がありませんでした。たとえば、スラッシュを/バックスラッシュでエスケープすること\は JSON では有効ですが、YAML では有効ではありませんでした。[ 49 ] YAML はコメントをサポートしていますが、JSON はサポートしていません。[ 49 ] [ 47 ] [ 20 ]
CSON(「CoffeeScript Object Notation」)は、重要なインデントと引用符なしのキーを使用し、外側のオブジェクト宣言を前提としています。これは、GitHubのAtom テキストエディタの設定に使用されました。[ 50 ] [ 51 ] [ 52 ]
また、JSONと構文的に類似したCSON(「筆記体オブジェクト表記法」)と呼ばれる無関係なプロジェクトも存在する。 [ 53 ]
HOCON (「人間が読みやすいように最適化された構成オブジェクト表記法」)は、人間が読みやすいデータのためのフォーマットであり、JSONの上位互換です。[ 54 ] HOCONの用途は次のとおりです。
JSON5(「JSON5データ交換フォーマット」)はJSON構文の拡張であり、JSONと同様にJavaScript構文としても有効です。仕様は2012年に開始され、2018年にバージョン1.0.0で完成しました。[ 65 ] JSON構文との主な違いは次のとおりです。
JSON5構文は、 SQLiteなどの一部のソフトウェアでJSON構文の拡張としてサポートされています。[ 66 ]
JSONC (JSON with Comments)は、MicrosoftのVisual Studio Codeで使用されるJSON5のサブセットです。[ 67 ] [ 68 ]
//)とブロックコメント(/* */)をサポートしています[ 69 ]JSON仕様に基づいて、またはJSON仕様から派生したシリアル化フォーマットがいくつかあります。例としては、
私の代名詞は「ペ」/「パー」です。
「ジェイソーン」または「ジェイソン」と発音するが、どちらにしても発音が間違っていると言われるので、どちらでも構わない。(cot-caught の融合を仮定すると、「sawn」/ s ɔː n / → [sɒn])。
JavaとActiveXが残した領域を占め、クライアント側のアニメーションの事実上の標準となった。
これは、JavaScriptプログラミング言語、標準ECMA-262第3版(1999年12月)のサブセットに基づいています。
はJavaScriptのオブジェクトリテラル表記のサブセットです。
パース指示を保持するためにコメントを使用している人がいるのを見て、JSON からコメントを削除しました。この方法は相互運用性を損なうものでした。コメントがないことを悲しむ人がいることは知っていますが、悲しむべきではありません。JSON を使用して設定ファイルを保存し、注釈を付けたいとします。好きなだけコメントを挿入してください。次に、それをJSON パーサーに渡す前に、
JSMin
にパイプします。
[2001] は、JavaScript ファイルからコメントと不要な空白を削除するミニファイツールです。
データ表現には、YAML、YAMLEX、JSON、JSON5、HJSON、あるいは純粋なPythonなど、次のいずれかを選択できます。
主な目的は、JSONのセマンティクス(ツリー構造、型のセット、エンコード/エスケープ)を維持しつつ、人間が編集しやすい設定ファイル形式としてより便利にすることです。