@@ -32,6 +32,8 @@ FUNCTION lexer(jsrc IN OUT NOCOPY json_src) RETURN lTokens;
3232
3333PROCEDURE 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);
3434
35+ FUNCTION parse(tokens IN lTokens, firstToken IN VARCHAR2) RETURN json_nodes;
36+
3537----------------------------------------------------------
3638-- GLOBAL MODULES
3739----------------------------------------------------------
@@ -630,7 +632,7 @@ BEGIN
630632 RETURN;
631633
632634 ELSE
633- p_error('Expected string or }' , tok);
635+ p_error('Expected string or } but found '||tok.type_name , tok);
634636
635637 END CASE;
636638
@@ -788,7 +790,7 @@ BEGIN
788790 p_error('Premature exit in array', tok);
789791 END IF;
790792 ELSIF (tok.type_name != ']') THEN --error
791- p_error('Expected , or ]' , tok);
793+ p_error('Expected , or ] but found '||tok.type_name , tok);
792794 END IF;
793795
794796 END LOOP;
@@ -929,52 +931,17 @@ BEGIN
929931END parseMem;
930932
931933----------------------------------------------------------
932- -- parse_list
934+ -- parse
933935--
934- FUNCTION parse_list(str CLOB ) RETURN json_nodes
936+ FUNCTION parse(tokens IN lTokens, firstToken IN VARCHAR2 ) RETURN json_nodes
935937IS
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;
970942 aParentID BINARY_INTEGER := NULL;
971943 aLastID BINARY_INTEGER := NULL;
972944BEGIN
973- updateDecimalPoint();
974- jsrc := prepareClob(str);
975-
976- tokens := lexer(jsrc);
977-
978945 -- dump tokens
979946 /*
980947 dbms_output.put_line('----------LEXER-S----------');
@@ -986,42 +953,93 @@ BEGIN
986953 dbms_output.put_line('----------LEXER-E----------');
987954 */
988955
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+
989960 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 := ']';
990966 indx := indx + 1;
991- --yyy obj := parseObj(tokens, indx);
992- parseObj(tokens, indx, aParentID, aLastID, obj);
967+ parseArr(tokens, indx, aParentID, aLastID, nodes);
993968 ELSE
994- raise_application_error(-20101, 'JSON Parser exception - no { start found');
969+ raise_application_error(-20101, 'JSON Parser exception - no '||firstToken||' start found');
995970 END IF;
996971 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));
998973 END IF;
999974
1000- RETURN obj ;
1001- END parser ;
975+ RETURN nodes ;
976+ END parse ;
1002977
1003978----------------------------------------------------------
1004- -- parse_any
979+ -- parse_object
1005980--
1006- FUNCTION parse_any (str CLOB) RETURN /*yyy json_value*/ json_nodes
981+ FUNCTION parse_object (str CLOB) RETURN json_nodes
1007982IS
983+ jsrc json_src;
1008984 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
10121002 jsrc json_src;
1003+ tokens lTokens;
10131004BEGIN
1014- debug('parse_any' );
1005+ updateDecimalPoint( );
10151006 jsrc := prepareClob(str);
10161007 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);
10211038 END IF;
10221039
1023- --yyy return obj.head();
1024- RETURN NULL;
1040+ value.nodes := parse(tokens=>tokens, firstToken=>firstToken);
1041+
1042+ RETURN value;
10251043END parse_any;
10261044
10271045END json_parser;
0 commit comments