JSON Functions That Return JSON Values

This document describes JSON functions that return JSON values.

JSON_DEPTH()

The JSON_DEPTH(json_doc) function returns the maximum depth of a JSON document.

Examples:

In the following example, JSON_DEPTH() returns 3 because there are three levels:

  • root ($)
  • weather ($.weather)
  • weather current ($.weather.sunny)
SELECT JSON_DEPTH('{"weather": {"current": "sunny"}}');
+-------------------------------------------------+ | JSON_DEPTH('{"weather": {"current": "sunny"}}') | +-------------------------------------------------+ | 3 | +-------------------------------------------------+ 1 row in set (0.00 sec)

JSON_LENGTH()

The JSON_LENGTH(json_doc [,path]) function returns the length of a JSON document. If a path argument is given, it returns the length of the value within the path.

Examples:

In the following example, the returned value is 1 because the only item at the root of the document is weather.

SELECT JSON_LENGTH('{"weather": {"current": "sunny", "tomorrow": "cloudy"}}','$');
+----------------------------------------------------------------------------+ | JSON_LENGTH('{"weather": {"current": "sunny", "tomorrow": "cloudy"}}','$') | +----------------------------------------------------------------------------+ | 1 | +----------------------------------------------------------------------------+ 1 row in set (0.00 sec)

In the following example, the returned value is 2 because there are two items at $.weather: current and tomorrow.

SELECT JSON_LENGTH('{"weather": {"current": "sunny", "tomorrow": "cloudy"}}','$.weather');
+------------------------------------------------------------------------------------+ | JSON_LENGTH('{"weather": {"current": "sunny", "tomorrow": "cloudy"}}','$.weather') | +------------------------------------------------------------------------------------+ | 2 | +------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)

JSON_TYPE()

The JSON_TYPE(json_val) function returns a string indicating the type of a JSON value.

Example:

WITH demo AS ( SELECT 'null' AS 'v' UNION SELECT '"foobar"' UNION SELECT 'true' UNION SELECT '5' UNION SELECT '1.14' UNION SELECT '[]' UNION SELECT '{}' UNION SELECT POW(2,63) ) SELECT v, JSON_TYPE(v) FROM demo ORDER BY 2;
+----------------------+--------------+ | v | JSON_TYPE(v) | +----------------------+--------------+ | [] | ARRAY | | true | BOOLEAN | | 1.14 | DOUBLE | | 9.223372036854776e18 | DOUBLE | | 5 | INTEGER | | null | NULL | | {} | OBJECT | | "foobar" | STRING | +----------------------+--------------+ 8 rows in set (0.00 sec)

Note that values that look the same might not have the same type, as demonstrated in the following example.

SELECT '"2025-06-14"',CAST(CAST('2025-06-14' AS date) AS json);
+--------------+------------------------------------------+ | "2025-06-14" | CAST(CAST('2025-06-14' AS date) AS json) | +--------------+------------------------------------------+ | "2025-06-14" | "2025-06-14" | +--------------+------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_TYPE('"2025-06-14"'),JSON_TYPE(CAST(CAST('2025-06-14' AS date) AS json));
+---------------------------+-----------------------------------------------------+ | JSON_TYPE('"2025-06-14"') | JSON_TYPE(CAST(CAST('2025-06-14' AS date) AS json)) | +---------------------------+-----------------------------------------------------+ | STRING | DATE | +---------------------------+-----------------------------------------------------+ 1 row in set (0.00 sec)

JSON_VALID()

The JSON_VALID(str) function checks if the argument is valid JSON. This can be useful for checking a column before converting it to the JSON type.

SELECT JSON_VALID('{"foo"="bar"}');
+-----------------------------+ | JSON_VALID('{"foo"="bar"}') | +-----------------------------+ | 0 | +-----------------------------+ 1 row in set (0.01 sec)
SELECT JSON_VALID('{"foo": "bar"}');
+------------------------------+ | JSON_VALID('{"foo": "bar"}') | +------------------------------+ | 1 | +------------------------------+ 1 row in set (0.01 sec)

See also

Was this page helpful?