プライマリ・コンテンツに移動
Oracle® Database JSON開発者ガイド
12c リリース2 (12.2)
E85247-02
目次へ移動
目次
索引へ移動
索引

前
次

2 JSONデータ

JavaScript Object Notation (JSON)は、標準ECMA-404 (JSONデータ交換フォーマット)およびECMA-262 (ECMAScript言語仕様、第3版)で定義されています。ECMAScriptのJavaScript言語は、WebブラウザおよびWebサーバーで広く使用されている汎用プログラミング言語です。

ここでのトピック

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アプリケーション間でネットワークを介して交換するために使用されます。

関連項目:

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オブジェクトを示しており、最上位のフィールド名はPONumberReferenceRequestorUserCostcenterShippingInstructionSpecial InstructionsAllowPartialShipmentおよび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には値としてオブジェクトがあります。このオブジェクトには、フィールドnameAddressおよびPhoneを持つ3つのメンバーがあります。フィールドnameには文字列値("Alexis Bull")があります。

  • フィールドAddressの値は、フィールドstreetcitystatezipCodeおよびcountryを持つオブジェクトです。フィールドzipCodeには数値があります。他のフィールドには文字列値があります。

  • フィールドPhoneには値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドtypeおよびnumberの2つのメンバーとそれらの値があります。

  • フィールドSpecial Instructionsにはnull値があります。

  • フィールドAllowPartialShipmentにはブール値falseがあります。

  • フィールドLineItemsには値として配列があります。この配列には2つの要素があり、それぞれがオブジェクトを表します。これらの各オブジェクトには、フィールドItemNumberPartおよびQuantityを持つ3つのメンバーがあります。

  • フィールドItemNumberおよびQuantityには数値があります。フィールドPartには値として、フィールドDescriptionUnitPriceおよび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と一緒には使用できません。使用する場合は必ず、名前を二重引用符で囲む必要があります