2 JSONデータ
JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。
トピック:
- JSONの概要
JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。 - JSON構文およびJSON構文が表すデータ
JSON (およびJavaScript)の値、スカラー、オブジェクトおよび配列について説明します。 - XMLと比較したJSON
一般的に、JSONとXML (Extensible Markup Language)は両方ともデータ交換言語として使用されます。主な違いは次のとおりです。
2.1 JSONの概要
JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。
JSONは、JavaScriptのオブジェクト・リテラル表記法のサブセットであるとも言えます。脚注1JSONは、JavaScriptのオブジェクト・リテラルを表すために使用できるため、一般的にデータ交換言語として機能します。この点において、XMLとよく似ています。
JSONは、JavaScript表記法(のサブセットとも言える表記法)であるため、多くの場合、解析やシリアライズを行う必要なくJavaScriptプログラムで使用できます。これは、JavaScriptのオブジェクト・リテラル、配列およびスカラー・データを表すテキスト・ベースの方法です。
JSONは、JavaScriptのコンテキストで定義されているため、実際には言語に依存しないデータ・フォーマットです。JSONデータは様々なプログラミング言語で解析および生成できます。
JSONは、人間にとっては読み書きが比較的簡単であり、ソフトウェアにとっては解析および生成が簡単です。多くの場合、構造化されたデータをシリアライズし、通常はサーバーとWebアプリケーション間でネットワークを介して交換するために使用されます。
関連項目:
-
JSONデータ交換フォーマットの定義については、『ECMA 404』および『IETF RFC4627』を参照してください
-
ECMAScript言語仕様については、『ECMA 262』を参照してください
-
JSONの詳細は、JSON.orgを参照してください
2.2 JSON構文およびJSON構文が表すデータ
JSON (およびJavaScript)の値、スカラー、オブジェクトおよび配列について説明します。
JSONの値は、オブジェクト、配列、数値、文字列、ブール値(true
またはfalse
)またはnull
のいずれかです。オブジェクトおよび配列を除くすべての値はスカラーです。
注意:
JSON値のnull
は、SQLに関するかぎり、1つの値です。これは、SQLで値の欠如(存在しないデータ、不明なデータまたは適用できないデータ)を表すNULL
とは異なります。特に、SQL条件のIS NULL
は、JSONのnull
値に対してfalseを戻し、SQL条件のIS NOT NULL
はtrueを戻します。
JavaScriptオブジェクトは、プロパティ名と関連するJSON値の0(ゼロ)個以上のペアの連想配列(ディクショナリ)です。Foot 2JSONオブジェクトは、JavaScriptオブジェクト・リテラルです。Foot 3これは、中括弧({
、}
)で囲まれたプロパティ・リストで、カンマ(,
)区切りの名前/値ペアと、各ペアがコロン(:
)で区切られた名前と値が含まれます。(カンマまたはコロンの前後のホワイトスペースはオプションで、重要ではありません。)
JSONでは、各プロパティ名および各文字列値は、二重引用符("
)で囲む必要があります。JavaScript表記法では、オブジェクト・リテラルで使用されるプロパティ名は、二重引用符で囲むことができますが、必須ではありません。これはまた、一重引用符('
)で囲むこともできます。
こうした違いの結果、実際には、引用符で囲まれていないプロパティ名か一重引用符で囲まれたプロパティ名を使用して表されたデータが、JSONで表されているように緩やかに参照される場合があり、Oracle Database実装を含む一部のJSON実装では、引用符で囲まれていないプロパティ名も、一重引用符で囲まれたプロパティ名も使用できる緩慢な構文がサポートされます。
JSONの文字列は、バックスラッシュ(\
)によるエスケープを使用したUnicode文字で構成されています。JSONの数値(数字)は10進数表記法で表され、符号が付いている場合や10進数指数が含まれる場合があります。
オブジェクト・プロパティは、通常フィールドと呼ばれます。これがキーと呼ばれることもありますが、「キー」という言葉の他の使用方法と混同することを避けるために、このマニュアルでは基本的に「フィールド」を使用します。オブジェクト・プロパティの名前/値ペアは、よくオブジェクトのメンバーと呼ばれます(ただし、メンバーは単にプロパティを意味する場合もあります)。オブジェクト・メンバー間の順序は重要ではありません。
注意:
-
JSONフィールド名は空(
""
と記述される)にできます。Foot 4 -
特定のJSONオブジェクトの各フィールド名は必ずしも一意である必要はなく、同じフィールド名を繰り返し使用できます。Oracle Databaseで採用されているSQL/JSONパスの評価では常に、特定のフィールド名を持つオブジェクト・メンバーの1つのみが使用されます。同じ名前を持つ他のメンバーは無視されます。このような複数のメンバーのうちどれが使用されるかは指定されていません。
JSONオブジェクトの一意フィールドと重複フィールドを参照してください。
JavaScript配列には、0個以上の要素があります。JSON配列は、配列要素(項目とも呼ばれる)の表現を囲む大カッコ([
、]
)で表されます。各要素はカンマ(,
)で区切られたオブジェクト、配列またはスカラー値です。配列要素の順序には意味があります。(大カッコまたはカンマの前後のホワイトスペースはオプションで、重要ではありません。)
例2-1 A JSONオブジェクト(JavaScriptのオブジェクト・リテラルの表現)
この例は、発注書を表すJSONオブジェクトを示しており、最上位のフィールド名はPONumber
、Reference
、Requestor
、User
、Costcenter
、ShippingInstruction
、Special Instructions
、AllowPartialShipment
およびLineItems
です。
{ "PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" : { "name" : "Alexis Bull",
"Address": { "street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America" },
"Phone" : [ { "type" : "Office", "number" : "909-555-7307" },
{ "type" : "Mobile", "number" : "415-555-1234" } ] },
"Special Instructions" : null,
"AllowPartialShipment" : false,
"LineItems" : [ { "ItemNumber" : 1,
"Part" : { "Description" : "One Magic Christmas",
"UnitPrice" : 19.95,
"UPCCode" : 13131092899 },
"Quantity" : 9.0 },
{ "ItemNumber" : 2,
"Part" : { "Description" : "Lethal Weapon",
"UnitPrice" : 19.95,
"UPCCode" : 85391628927 },
"Quantity" : 5.0 } ] }
-
この例のほとんどのフィールドには文字列値があります。たとえば、フィールド
User
には値"ABULL"
があります。 -
フィールド
PONumber
およびzipCode
にはそれぞれ数値1600
および99236
があります。 -
フィールド
Shipping Instructions
には値としてオブジェクトがあります。このオブジェクトには、フィールドname
、Address
およびPhone
を持つ3つのメンバーがあります。フィールドname
には文字列値("Alexis Bull"
)があります。 -
フィールド
Address
の値は、フィールドstreet
、city
、state
、zipCode
およびcountry
を持つオブジェクトです。フィールドzipCode
には数値があります。他のフィールドには文字列値があります。 -
フィールド
Phone
には値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドtype
およびnumber
の2つのメンバーとそれらの値があります。 -
フィールド
Special Instructions
にはnull
値があります。 -
フィールド
AllowPartialShipment
にはブール値false
があります。 -
フィールド
LineItems
には値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドItemNumber
、Part
およびQuantity
を持つ3つのメンバーがあります。 -
フィールド
ItemNumber
およびQuantity
には数値があります。フィールドPart
には値として、フィールドDescription
、UnitPrice
およびUPCCode
を持つオブジェクトがあります。フィールドDescription
には文字列値があります。フィールドUnitPrice
およびUPCCode
には数値があります。
関連項目:
2.3 XMLと比較したJSON
一般的に、JSONとXML (Extensible Markup Language)は両方ともデータ交換言語として使用されます。主な違いは次のとおりです。
JSONは、単純な構造データで使用する場合に最も役立ちます。XMLは、構造化されたデータと半構造化されたデータの両方で役立ちます。通常、JSONは文書中心ではなくデータ中心ですが、XMLはどちらにも対応しています。JSONはマークアップ言語ではなく、データ表現のみを目的として設計されています。XMLは、文書マークアップ言語とデータ表現言語の両方を兼ねています。
-
JSONのデータ型は数が少なく、事前に定義されています。XMLデータは、型がないか、XML SchemaまたはDocument Type Definition (DTD)に基づいています。
-
JSONには、単純な構造定義および文書結合構造体がありますが、属性、名前空間、継承および代替はありません。
-
JavaScriptのオブジェクト・リテラルのメンバーの順序は重要ではありません。通常、順序が問題になるのはXML文書内です。
-
JSONには、XMLのテキスト・ノード(XPathノード・テスト
text()
)に相当するものがありません。これは、特に混在コンテンツがないことを意味します(このことからも、JSONはマークアップ言語ではないと言えます)。 -
JSONには、日付のデータ型がありません(XMLとJavaScriptにはある)。JSONでは、日付は文字列などの使用可能なデータ型を使用して表されます。日付とJSON文字列間における変換には、事実上の業界標準がいくつかあります。ただし、いずれにせよ、JSONを使用するプログラムでは日付表現の変換を処理する必要があります。
通常、JSONデータの方がXMLデータより、定義および機能が単純であるため、生成、解析および処理が簡単です。XMLにはモジュール性と継承の役に立つ名前空間および他の構造体が用意されているため、通常、様々なデータ・ソースの結合が関わるユースケースはXMLの使用に適しています。
脚注の凡例
脚注1:JSONはこの点においてJavaScriptとは表記法が異なります。JSONでは、文字列内でエスケープされていないUnicode文字U+2028 (LINE SEPARATOR)およびU+2029 (PARAGRAPH SEPARATOR)が許可されます。JavaScriptの表記法では、文字列内でこのような制御文字をエスケープする必要があります。JSONP (JSON with padding)データを生成するときにこの違いが重要になる場合があります。
脚注2:
したがって、JavaScriptオブジェクトは、CおよびC++のハッシュ表、JavaのHashMap、PHPの連想配列、Pythonのディクショナリ、PerlおよびRubyのハッシュと似ています。
脚注3:
コンストラクタObject
またはオブジェクト・リテラル構文{
...}
を使用してJavaScriptでオブジェクトが作成されます。
脚注4: 一部のコンテキストでは、空のフィールド名はOracle Databaseと一緒には使用できません。使用する場合は必ず、名前を二重引用符で囲む必要があります。