Files
Omni_orm.db/parse_JSON.txt
2026-02-06 14:31:07 +08:00

169 lines
6.5 KiB
Plaintext

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 ;