I have a MySQL column of json type. In there, a dict like JSON object is stored. Now, I want to extract the values from this JSON object and create a JSON array.
How can I achieve this?
with json_objs(json_col) as (
select CAST('{"key1": "value1", "key2": "value2"}' AS JSON)
UNION ALL
select CAST('{"key3": "value3", "key4": "value4"}' AS JSON)
)
select SOME_EXPR_I_CAN_T_FIGURE_OUT from json_objs
+----------------------+
| resulting_column |
+----------------------+
| ["value1", "value2"] |
| ["value3", "value4"] |
+----------------------+
CREATE TABLE `json_objs` (
`json_col` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
MySQL provides two operators ( -> and ->> ) to extract data from JSON columns. ->> will get the string value while -> will fetch value without quotes. As you can see ->> returns output as quoted strings, while -> returns values as they are. You can also use these operators in WHERE clause as shown below.
We can use the JSON_EXTRACT function to extract data from a JSON field. The basic syntax is: JSON_EXTRACT(json_doc, path) For a JSON array, the path is specified with $[index] , where the index starts from 0: mysql> SELECT JSON_EXTRACT('[10, 20, 30, 40]', '$[0]'); +------------------------------------------+
Convert JSON to Array Using `json. The parse() function takes the argument of the JSON source and converts it to the JSON format, because most of the time when you fetch the data from the server the format of the response is the string. Make sure that it has a string value coming from a server or the local source.
Extracting from Nested JSON Arrays using The first thing you should note is that unlike the JSON_EXTRACT() function which is a SELECT argument, JSON_TABLE() is a FROM argument. It transforms the column into a table with columns you can then call on in your.
You can use the ->
operator as in the expression column -> path
as follows:
create table table1 (
json_dict JSON
);
insert into table1 values('{"ak":"av","bk":"bv"}');
insert into table1 values('{"ak2":"av2","bk2":"bv2"}');
select * from table1;
+------------------------------+
| json_dict |
+------------------------------+
| {"ak": "av", "bk": "bv"} |
| {"ak2": "av2", "bk2": "bv2"} |
+------------------------------+
2 rows in set (0.00 sec)
select json_dict->"$.*" from table1;
+------------------+
| json_dict->"$.*" |
+------------------+
| ["av", "bv"] |
| ["av2", "bv2"] |
+------------------+
2 rows in set (0.00 sec)
https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#operator_json-column-path
Other than ->
operator, you can also use the Json_Extract()
function:
Schema (MySQL v8.0)
create table table1 (
json_dict JSON
);
insert into table1 values('{"ak":"av","bk":"bv"}');
insert into table1 values('{"ak2":"av2","bk2":"bv2"}');
Query #1
select JSON_EXTRACT(json_dict, '$.*') from table1;
| JSON_EXTRACT(json_dict, '$.*') |
| ------------------------------ |
| ["av", "bv"] |
| ["av2", "bv2"] |
View on DB Fiddle
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With