Function to Convert String to JSON
parse_json function
The function parse_json
converts a string argument to a JSON instance. The input string must be a comma-separated list of one or more name-value pairs.
json parse_json(string)
Semantics:
The input string argument must be a valid JSON text. The parse_json
function parses the string and converts it to a JSON object.
For more details on JSON data type in Oracle NoSQL Database data model, see JSON Data Type. An error is displayed if an incorrect JSON text is supplied in the string argument (for example, a missing colon to separate the name and field values).
Example 12-68 Consider a user data table for a library application. Currently, the subscription details are in a JSON document, which is stored as a string. You want to add them as a JSON object
CREATE TABLE userslib (id LONG GENERATED BY DEFAULT AS IDENTITY, details JSON, Book1 json,
Book2 Json, Book3 Json, PRIMARY KEY (id))
You can declare the subscription ID as an IDENTITY column. The current subscription details can be included as a JSON object in the details
field. Assuming, three books are allowed per subscription at any point, you can update the details of the borrowed books as JSON objects in the corresponding Book fields.
You use the parse_json
function to convert the subscription data of a user, which is in a string format to a JSON object and insert it into the JSON field as follows:
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 *
Explanation:
You must provide a string that is a valid JSON text. In this example, the INSERT statement parses the string using the parse_json
function to create JSON objects, which are then updated as elements in the details field. Notice that the value for the id
field, which is the primary key is auto-generated as you have declared it as an IDENTITY column. For more details, see Inserting Rows with an IDENTITY Column. Also, since you have not provided any values for the books fields in this example, they are populated with NULL values.
{
"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
}
Example 12-69 Fetch from the library application, the book titles of the borrowed books for a user
userslib
table above, update the book fields for a user with the details of the books that are borrowed from the library. 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 *
If any JSON data is in a string format inadvertently while updating the book details, the operation still succeeds as the string data is a valid JSON. However, the fields are populated with the unparsed string as follows:
{
"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"
}
}
}
Here, the Book1
field is populated as a complete string. The Book2
field has a doc attribute, which is JSON, however, the value is a string. The Book3
field is a proper JSON document.
You can use the parse_json
function to select the JSON values from the table as follows:
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
Explanation:
You can use the parse_json
function to parse the string values in the JSON field. In the Book1
field above, the value is a JSON document stored as a string. You parse the complete string to convert it to a JSON object and then select the title field. In the Book2
field, the value of the doc attribute is a JSON document stored as a string. Here, you parse the attribute value to convert it to a JSON object and then select the title field. The Book3
field is a valid JSON object, from which you can extract the title value directly using the path expression.
{
"id" : 2,
"email" : "john.smith@reachmail.com",
"title1" : "A Tale of two cities",
"title2" : "Harry Potter",
"title3" : "Percy Jackson"
}