文字列をJSONに変換する関数

parse_json関数

関数parse_jsonでは、文字列引数がJSONインスタンスに変換されます。入力文字列は、1つ以上の名前/値ペアのカンマ区切りリストである必要があります。

構文:
json parse_json(string)

セマンティクス:

入力文字列引数は、有効なJSONテキストである必要があります。parse_json関数では、文字列が解析されてそれがJSONオブジェクトに変換されます。

Oracle NoSQL Databaseデータ・モデルでのJSONデータ型の詳細は、「JSONデータ型」を参照してください。文字列引数に正しくないJSONテキスト(名前とフィールド値を区切るコロンがないなど)が指定されている場合は、エラーが表示されます。

例1: 図書館アプリケーションのユーザー・データ表について考えてみます。現在、サブスクリプション詳細はJSONドキュメント内にあり、文字列として格納されています。それらをJSONオブジェクトとして追加する必要があるとします。

これを実現するために、この表では次のスキーマを考慮に入れます。
CREATE TABLE userslib (id LONG GENERATED BY DEFAULT AS IDENTITY, details JSON, Book1 json,
      Book2 Json, Book3 Json, PRIMARY KEY (id))

サブスクリプションIDをIDENTITY列として宣言できます。現在のサブスクリプション詳細は、JSONオブジェクトとしてdetailsフィールドに含めることができます。いつでもサブスクリプションごとに3冊の本が許可されると仮定すると、借りた本の詳細を、対応するBookフィールド内のJSONオブジェクトとして更新できます。

次のように、parse_json関数を使用してユーザーのサブスクリプション・データ(文字列書式)をJSONオブジェクトに変換し、それをJSONフィールドに挿入します。
mode json -pretty

insert into userslib (details) values (parse_json("{\"firstName\":\"John\",\"lastName\":\"Smith\",\"DOB\":\"22-2-1995\",\"address\":{\"city\":\"Santa Cruz\",\"number\":101,\"contactphone\":\"408-453-8955\",\"state\":\"CA\",\"street\":\"Pacific Ave\",\"zip\":95008},\"email\":\"john.smith@reachmail.com\"}")) RETURNING *

説明:

有効なJSONテキストである文字列を指定する必要があります。この例では、INSERT文で、parse_json関数を使用して文字列を解析し、JSONオブジェクトを作成します。このオブジェクトは、その後、detailsフィールド内の要素として更新されます。なお、主キーであるidフィールドの値は、IDENTITY列として宣言してあるため、自動生成されます。詳細は、「IDENTITY列を含む行の挿入」を参照してください。また、この例ではbookのフィールドに値が指定されていないため、それらにはNULL値が移入されます。

出力:
{
  "id" : 2,
  "details" : {
    "DOB" : "22-2-1995",
    "address" : {
      "city" : "Santa Cruz",
      "contactphone" : "408-453-8955",
      "number" : 101,
      "state" : "CA",
      "street" : "Pacific Ave",
      "zip" : 95008
    },
    "email" : "john.smith@reachmail.com",
    "firstName" : "John",
    "lastName" : "Smith"
  },
  "Book1" : null,
  "Book2" : null,
  "Book3" : null
}

例2: 図書館アプリケーションから、あるユーザーについて、借りた本の書名をフェッチします。

前述のuserslib表で、ユーザーのbookのフィールドを、図書館から借りた本の詳細で更新します。
UPSERT into userslib values (2, {"DOB":"22-2-1995","address":{"city":"Santa Cruz","contactphone":"408-453-8955","number":101,"state":"CA","street":"Pacific Ave","zip":95008},"email":"john.smith@reachmail.com","firstName":"John","lastName":"Smith"}, '{"doc":{"title":"A Tale of two cities", "author":"Charles Dickens", "site":"brooks.publishers.com"}}', {"doc":'{"title":"Harry Potter", "author":"J K Rowling", "site":"brooks.publishers.com"}'}, {"doc":{"title":"Percy Jackson", "author":"Rick Riodran", "site":"brooks.publishers.com"}}) RETURNING *;

本の詳細の更新中にJSONデータが誤って文字列形式になっていた場合でも、その文字列データは有効なJSONであるため操作に成功します。ただし、それらのフィールドには、次のように未解析の文字列が移入されます。

{
  "id" : 2,
  "details" : {
    "DOB" : "22-2-1995",
    "address" : {
      "city" : "Santa Cruz",
      "contactphone" : "408-453-8955",
      "number" : 101,
      "state" : "CA",
      "street" : "Pacific Ave",
      "zip" : 95008
    },
    "email" : "john.smith@reachmail.com",
    "firstName" : "John",
    "lastName" : "Smith"
  },
  "Book1" : "{\"doc\":{\"title\":\"A Tale of two cities\", \"author\":\"Charles Dickens\", \"site\":\"brooks.publishers.com\"}}",
  "Book2" : {
    "doc" : "{\"title\":\"Harry Potter\", \"author\":\"J K Rowling\", \"site\":\"brooks.publishers.com\"}"
  },
  "Book3" : {
    "doc" : {
      "author" : "Rick Riordan",
      "site" : "brooks.publishers.com",
      "title" : "Percy Jackson"
    }
  }
}

ここでは、Book1フィールドは、完全な文字列として移入されます。Book2フィールドにはdoc属性(JSON)があります。ただし、この値は文字列です。Book3フィールドは、適切なJSONドキュメントです。

次のように、parse_json関数を使用して表からJSON値を選択できます。

SELECT 
u.id, u.details.email,
parse_json(u.Book1).doc.title as title1,
parse_json(u.Book2.doc).title as title2,
u.Book3.doc.title as title3
FROM userslib u WHERE id=2;

説明:

parse_json関数を使用してJSONフィールド内の文字列値を解析できます。前述のBook1フィールドでは、値は、文字列として格納されているJSONドキュメントです。完全な文字列を解析してそれをJSONオブジェクトに変換した後、titleフィールドを選択しています。Book2フィールドでは、そのdoc属性の値は、文字列として格納されているJSONドキュメントです。ここでは、その属性値を解析してそれをJSONオブジェクトに変換した後、titleフィールドを選択しています。Book3フィールドは有効なJSONオブジェクトであり、パス式を使用してそこからtitle値を直接抽出できます。

出力:
{
  "id" : 2,
  "email" : "john.smith@reachmail.com",
  "title1" : "A Tale of two cities",
  "title2" : "Harry Potter",
  "title3" : "Percy Jackson"
}