DELIMITER // CREATE OR REPLACE PROCEDURE Parse_JSON( IN p_uuid VARCHAR(100), IN json_input JSON ) /* call Parse_JSON('uuid-20250803', '{"custcateid":"08","custcatecname":"8888","custcateename":"","memochar":"","mergetype":"","token":"c975931c-6f8d-11f0-9c5f-d8bbc15c1404","_$_tableName":"bascustcategory", "_$_pk":"custcateid", "_$_action":"D"}'); call Parse_JSON('uuid-20250803', '{"sprintid":"Next-Sprint","sprint_title":"調整現行 PBI 緩衝用的 Sprint(2025)","sprint_startdate":"2025-01-01T00:00:00.000+08:00","sprint_enddate":"2099-12-30T16:00:00.000Z","time_range":"2099", "token":"768f1c89-6fb9-11f0-9c5f-d8bbc15c1404", "_$_tableName":"pms_sprint", "_$_pk":"sprintid", "_$_action":"U"}'); call Parse_JSON('uuid-20250803_3', '{"rows":[{"custcateid":"09","custcatecname":"9999","custcateename":"9999-memo","memochar":"","mergetype":""}], "rowsDiff":[{"custcateename":"9999-memo"}],"indexes":["7"], "rowsOrigin": [{"custcateid":"09","custcatecname":"9999","custcateename":"","memochar":"","mergetype":""}], "unModifiedItems":[ {"custcateid":"01","custcatecname":"經銷商","custcateename":"333","memochar":"","mergetype":"0"}, {"custcateid":"02","custcatecname":"代理商","custcateename":"444","memochar":"","mergetype":"0"}, {"custcateid":"03","custcatecname":"大型企業","custcateename":"","memochar":"","mergetype":"0"}, {"custcateid":"04","custcatecname":"政府","custcateename":"","memochar":"","mergetype":"0"}, {"custcateid":"05","custcatecname":"中小企業","custcateename":"","memochar":"","mergetype":"0"}, {"custcateid":"06","custcatecname":"學校","custcateename":"","memochar":"","mergetype":"0"}, {"custcateid":"07","custcatecname":"竹科","custcateename":"","memochar":"","mergetype":"0"}], "token":"d101363e-700c-11f0-9c5f-d8bbc15c1404","_$_tableName":"bascustcategory","_$_pk":"custcateid","_$_action":"U"}'); call Parse_JSON('uuid-20250820_1', '{"projectclassid":"soft-dev","proj_boss":"120102", "config":[{"label":"(GM) 總經理室", "children":[ {"label":"(120101) 高光","value":"120101"}, {"label":"(121108) 沈秋月","value":"121108"}, {"label":"(200605) 陳明文","value":"200605"}, {"label":"(120102) 王俊傑","value":"120102"}, {"label":"(150201) 衛斯理","value":"150201"}, {"label":"(190802) 葉子龍","value":"190802"}, {"label":"(210301) 高國華","value":"210301"}, {"label":"(admin)admin","value":"admin"}, {"label":"(160805) 邱雅惠","value":"160805"}, {"label":"(170911) 劉強南","value":"170911"}, {"label":"(201001) 林志堅","value":"201001"}, {"label":"(120912) 陳進德","value":"120912"}, {"label":"(170109) 林玉玲","value":"170109"}, {"label":"(180210) 秦一明","value":"180210"}, {"label":"(191006) 歐陽龍","value":"191006"}, {"label":"(201036) 邱郁芳","value":"201036"}, {"label":"(demo) 測試用戶","value":"demo"}] }], "projectid":"IT-2025-Chaos","proj_cname":"MariaDB改寫專案","proj_status":"SASD","proj_startdate":"2025-08-01","proj_enddate":"2025-09-30", "proj_year":"2025","token":"a85afca2-7dc5-11f0-9c5f-d8bbc15c1404", "_$_tableName":"pmsproject", "_$_pk":"projectid", "_$_action":"C"}'); */ BEGIN DECLARE i INT DEFAULT 0; DECLARE total_keys INT; DECLARE key_name VARCHAR(255); DECLARE val JSON; DECLARE sub_key_name VARCHAR(255); DECLARE sub_val JSON; DECLARE sub_total_keys INT; DECLARE j INT; DECLARE x INT; DECLARE y INT; DECLARE arr_count,arr_idx INT; DECLARE arr_obj JSON; -- 取第一層 keys 數量 SET total_keys = JSON_LENGTH(JSON_KEYS(json_input)); SET x = 1; SET y = 1; WHILE i < total_keys DO SET key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(json_input), CONCAT('$[', i, ']'))); SET val = JSON_EXTRACT(json_input, CONCAT('$.', key_name)); -- 插入第一層 -- INSERT INTO tmp_json_parse_result (level, parent_key, key_name, value) INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType) VALUES (p_uuid, key_name, x, NULL, JSON_UNQUOTE(val), JSON_TYPE(val)); SET y = x; SET x = x + 1; -- 第二層處理:若 value 是 object 或 array,解析其 key-value (當前版本只處理 2層, 多的暫時不管) IF JSON_TYPE(val) IN ('OBJECT', 'ARRAY') THEN -- 先處理 ARRAY 可能有多筆資料 IF JSON_TYPE(val) = 'ARRAY' THEN SET arr_count = JSON_LENGTH(val); SET arr_idx = 0; WHILE arr_idx < arr_count DO -- 取出陣列中的單一物件 SET arr_obj = JSON_EXTRACT(val, CONCAT('$[', arr_idx, ']')); SET j = 0; SET sub_total_keys = JSON_LENGTH(JSON_KEYS(arr_obj)); WHILE j < sub_total_keys DO SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(arr_obj), CONCAT('$[', j, ']'))); SET sub_val = JSON_EXTRACT(arr_obj, CONCAT('$.', sub_key_name)); INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, Object_ID, StringValue, ValueType) VALUES (p_uuid, sub_key_name, x, y, arr_idx+1, JSON_UNQUOTE(sub_val), JSON_TYPE(sub_val)); SET j = j + 1; SET x = x + 1; END WHILE; SET arr_idx = arr_idx + 1; END WHILE; ELSE -- 處理單一 OBJECT SET j = 0; SET sub_total_keys = JSON_LENGTH(JSON_KEYS(val)); WHILE j < sub_total_keys DO SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(val), CONCAT('$[', j, ']'))); SET sub_val = JSON_EXTRACT(val, CONCAT('$.', sub_key_name)); INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType) VALUES (p_uuid, sub_key_name, x, y, JSON_UNQUOTE(sub_val), JSON_TYPE(sub_val)); SET j = j + 1; SET x = x + 1; END WHILE; END IF; END IF; /* -- 第二層處理:若 value 是 object,解析其 key-value IF JSON_TYPE(val) in ('OBJECT','ARRAY') THEN -- 先解決 rows Grid Edit 多筆資料, 後續應該還有其他狀況要一一排除 SET j = 0; -- IF SELECT TRIM(BOTH '[]' FROM '[example]') AS result; SET sub_total_keys = JSON_LENGTH(JSON_KEYS(val)); WHILE j < sub_total_keys DO SET sub_key_name = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(val), CONCAT('$[', j, ']'))); SET sub_val = JSON_EXTRACT(val, CONCAT('$.', sub_key_name)); -- INSERT INTO tmp_json_parse_result (level, parent_key, key_name, value) INSERT INTO sys_jsondata (UUID, `NAME`, SequenceNo, parent_ID, StringValue, ValueType) VALUES (p_uuid, sub_key_name, x, y , JSON_UNQUOTE(sub_val), JSON_TYPE(val)); SET j = j + 1; SET x = x + 1; END WHILE; END IF; */ SET i = i + 1; END WHILE; END // DELIMITER ;