@@ -32,6 +32,8 @@ FUNCTION lexer(jsrc IN OUT NOCOPY json_src) RETURN lTokens;
32
32
33
33
PROCEDURE parseMem(tokens lTokens, indx IN OUT PLS_INTEGER, mem_name VARCHAR2, mem_indx NUMBER, theParentID IN OUT BINARY_INTEGER, theLastID IN OUT BINARY_INTEGER, theNodes IN OUT NOCOPY json_nodes);
34
34
35
+ FUNCTION parse(tokens IN lTokens, firstToken IN VARCHAR2) RETURN json_nodes;
36
+
35
37
----------------------------------------------------------
36
38
-- GLOBAL MODULES
37
39
----------------------------------------------------------
@@ -630,7 +632,7 @@ BEGIN
630
632
RETURN;
631
633
632
634
ELSE
633
- p_error('Expected string or }' , tok);
635
+ p_error('Expected string or } but found '||tok.type_name , tok);
634
636
635
637
END CASE;
636
638
@@ -788,7 +790,7 @@ BEGIN
788
790
p_error('Premature exit in array', tok);
789
791
END IF;
790
792
ELSIF (tok.type_name != ']') THEN --error
791
- p_error('Expected , or ]' , tok);
793
+ p_error('Expected , or ] but found '||tok.type_name , tok);
792
794
END IF;
793
795
794
796
END LOOP;
@@ -929,52 +931,17 @@ BEGIN
929
931
END parseMem;
930
932
931
933
----------------------------------------------------------
932
- -- parse_list
934
+ -- parse
933
935
--
934
- FUNCTION parse_list(str CLOB ) RETURN json_nodes
936
+ FUNCTION parse(tokens IN lTokens, firstToken IN VARCHAR2 ) RETURN json_nodes
935
937
IS
936
- tokens lTokens;
937
- --yyy obj json_list;
938
- obj json_nodes := json_nodes();
939
- indx PLS_INTEGER := 1;
940
- jsrc json_src;
941
- BEGIN
942
- debug('parse_list');
943
- updateDecimalPoint();
944
- jsrc := prepareClob(str);
945
- tokens := lexer(jsrc);
946
- IF (tokens(indx).type_name = '[') THEN
947
- indx := indx + 1;
948
- --yyy obj := parseArr(tokens, indx);
949
- ELSE
950
- raise_application_error(-20101, 'JSON List Parser exception - no [ start found');
951
- END IF;
952
- IF (tokens.count != indx) THEN
953
- p_error('] should end the JSON List object', tokens(indx));
954
- END IF;
955
-
956
- RETURN obj;
957
- END parse_list;
958
-
959
- ----------------------------------------------------------
960
- -- parser
961
- --
962
- FUNCTION parser(str CLOB) RETURN json_nodes
963
- IS
964
- tokens lTokens;
965
- obj json_nodes := json_nodes();
966
-
967
- indx PLS_INTEGER := 1;
968
- jsrc json_src;
969
- i BINARY_INTEGER;
938
+ lastToken VARCHAR2(1) := NULL;
939
+ nodes json_nodes := json_nodes();
940
+ indx PLS_INTEGER := 1;
941
+ --i BINARY_INTEGER := NULL;
970
942
aParentID BINARY_INTEGER := NULL;
971
943
aLastID BINARY_INTEGER := NULL;
972
944
BEGIN
973
- updateDecimalPoint();
974
- jsrc := prepareClob(str);
975
-
976
- tokens := lexer(jsrc);
977
-
978
945
-- dump tokens
979
946
/*
980
947
dbms_output.put_line('----------LEXER-S----------');
@@ -986,42 +953,93 @@ BEGIN
986
953
dbms_output.put_line('----------LEXER-E----------');
987
954
*/
988
955
956
+ IF (tokens(indx).type_name != firstToken) THEN
957
+ raise_application_error(-20101, 'JSON Parser exception - invalid first token. Expected:'||firstToken||' bit found:'||tokens(indx).type_name);
958
+ END IF;
959
+
989
960
IF (tokens(indx).type_name = '{') THEN
961
+ lastToken := '}';
962
+ indx := indx + 1;
963
+ parseObj(tokens, indx, aParentID, aLastID, nodes);
964
+ ELSIF (tokens(indx).type_name = '[') THEN
965
+ lastToken := ']';
990
966
indx := indx + 1;
991
- --yyy obj := parseObj(tokens, indx);
992
- parseObj(tokens, indx, aParentID, aLastID, obj);
967
+ parseArr(tokens, indx, aParentID, aLastID, nodes);
993
968
ELSE
994
- raise_application_error(-20101, 'JSON Parser exception - no { start found');
969
+ raise_application_error(-20101, 'JSON Parser exception - no '||firstToken||' start found');
995
970
END IF;
996
971
IF (tokens.count != indx) THEN
997
- p_error('} should end the JSON object ', tokens(indx));
972
+ p_error(lastToken||' should end the last token in the JSON string ', tokens(indx));
998
973
END IF;
999
974
1000
- RETURN obj ;
1001
- END parser ;
975
+ RETURN nodes ;
976
+ END parse ;
1002
977
1003
978
----------------------------------------------------------
1004
- -- parse_any
979
+ -- parse_object
1005
980
--
1006
- FUNCTION parse_any (str CLOB) RETURN /*yyy json_value*/ json_nodes
981
+ FUNCTION parse_object (str CLOB) RETURN json_nodes
1007
982
IS
983
+ jsrc json_src;
1008
984
tokens lTokens;
1009
- --yyy obj json_list;
1010
- obj json_array := json_array();
1011
- indx PLS_INTEGER := 1;
985
+ BEGIN
986
+ updateDecimalPoint();
987
+ jsrc := prepareClob(str);
988
+ tokens := lexer(jsrc);
989
+
990
+ IF (tokens(1).type_name != '{') THEN
991
+ raise_application_error(-20101, 'JSON Parser exception - invalid first token = '||tokens(1).type_name);
992
+ END IF;
993
+
994
+ RETURN parse(tokens=>tokens, firstToken=>'{');
995
+ END parse_object;
996
+
997
+ ----------------------------------------------------------
998
+ -- parse_array
999
+ --
1000
+ FUNCTION parse_array(str CLOB) RETURN json_nodes
1001
+ IS
1012
1002
jsrc json_src;
1003
+ tokens lTokens;
1013
1004
BEGIN
1014
- debug('parse_any' );
1005
+ updateDecimalPoint( );
1015
1006
jsrc := prepareClob(str);
1016
1007
tokens := lexer(jsrc);
1017
- tokens(tokens.count+1).type_name := ']';
1018
- --yyy obj := parseArr(tokens, indx);
1019
- IF (tokens.count != indx) THEN
1020
- p_error('] should end the JSON List object', tokens(indx));
1008
+
1009
+ IF (tokens(1).type_name != '[') THEN
1010
+ raise_application_error(-20101, 'JSON Parser exception - invalid first token = '||tokens(1).type_name);
1011
+ END IF;
1012
+
1013
+ RETURN parse(tokens=>tokens, firstToken=>'[');
1014
+ END parse_array;
1015
+
1016
+ ----------------------------------------------------------
1017
+ -- parse_any
1018
+ --
1019
+ FUNCTION parse_any(str CLOB) RETURN json_value
1020
+ IS
1021
+ firstToken VARCHAR2(1);
1022
+ jsrc json_src;
1023
+ tokens lTokens;
1024
+ value json_value := json_value();
1025
+ BEGIN
1026
+ updateDecimalPoint();
1027
+ jsrc := prepareClob(str);
1028
+ tokens := lexer(jsrc);
1029
+
1030
+ IF (tokens(1).type_name = '{') THEN
1031
+ firstToken := tokens(1).type_name;
1032
+ value.typ := 'O';
1033
+ ELSIF (tokens(1).type_name = '[') THEN
1034
+ firstToken := tokens(1).type_name;
1035
+ value.typ := 'A';
1036
+ ELSE
1037
+ raise_application_error(-20101, 'JSON Parser exception - invalid first token = '||tokens(1).type_name);
1021
1038
END IF;
1022
1039
1023
- --yyy return obj.head();
1024
- RETURN NULL;
1040
+ value.nodes := parse(tokens=>tokens, firstToken=>firstToken);
1041
+
1042
+ RETURN value;
1025
1043
END parse_any;
1026
1044
1027
1045
END json_parser;
0 commit comments