DELIMITER $$ CREATE OR REPLACE PROCEDURE usp_parsejson ( IN _uuid VARCHAR(100), IN _json TEXT ) /* CALL usp_parsejson('1234', '{ "id":"abc", "nmae": "Michael"}'); SELECT * from _jsondata WHERE guid = '1234'; DELETE FROM _jsondata WHERE guid = '1234'; */ BEGIN DECLARE _json_clean TEXT; DECLARE _pair TEXT; DECLARE _key VARCHAR(255); DECLARE _value TEXT; DECLARE _valuetype VARCHAR(20); DECLARE _pos INT DEFAULT 1; DECLARE _len INT; DECLARE _curr INT DEFAULT 1; DECLARE _next INT; DECLARE _cnt INT DEFAULT 1; -- 建立暫存表 CREATE TEMPORARY TABLE IF NOT EXISTS _jsondata ( guid VARCHAR(100), rowid INT, fieldname VARCHAR(255), contents TEXT, fieldtype VARCHAR(20) ); -- 清除左右大括號與空白 SET _json_clean = REPLACE(_json,'{',''); SET _json_clean = REPLACE(_json_clean,'}',''); -- 計算逗號數(也就是 key:value 數) SET _len = LENGTH(_json_clean) - LENGTH(REPLACE(_json_clean, ',', '')) + 1; WHILE _cnt <= _len DO -- 取出第 cnt 個 key:value 配對 SET _pair = SUBSTRING_INDEX(SUBSTRING_INDEX(_json_clean, ',', _cnt), ',', -1); -- 取出 key SET _key = SUBSTRING_INDEX(_pair, ':', 1); SET _key = REPLACE(TRIM(_key),'"',''); -- 取出 value SET _value = SUBSTRING_INDEX(_pair, ':', -1); SET _value = TRIM(_value); -- 判斷型別 IF LEFT(_value, 1) = '"' AND RIGHT(_value, 1) = '"' THEN SET _valuetype = 'string'; SET _value = REPLACE(_value,'"',''); ELSE SET _valuetype = 'number'; END IF; -- 寫入結果 INSERT INTO _jsondata (guid, rowid, fieldname, contents, fieldtype) VALUES (_uuid, _cnt, _key, _value, _valuetype); -- 下一筆 SET _cnt = _cnt + 1; END WHILE; END$$ DELIMITER ;