文字列を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"
}