Если вы действительно не хотите использовать какие-либо встроенные функции JSON, и ваш ввод не включает вложенных объектов, вы можете использовать SQL с рекурсивным предложением факторинга подзапроса:
Установка Oracle :
CREATE TABLE test_data ( json ) AS
SELECT '[
{
"sentiment":"negative",
"confidence":0.6211975044276729
},
{
"confidence":0.3510681601407111,
"sentiment":"neutral"
},
{
"sentiment":"positive",
"confidence":0.027734335431616075
}
]' FROM DUAL
Запрос
WITH rsqfc ( json, obj, lvl, cnt ) AS (
SELECT json,
REGEXP_SUBSTR( json, '\{(.*?)\}', 1, 1, 'n' ),
1,
REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' )
FROM test_data
WHERE REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' ) > 1
UNION ALL
SELECT json,
REGEXP_SUBSTR( json, '\{(.*?)\}', 1, LVL + 1, 'n' ),
lvl + 1,
cnt
FROM rsqfc
WHERE lvl < cnt
)
SELECT REGEXP_SUBSTR( obj, '"sentiment":\s*"(negative|neutral|positive)"', 1, 1, 'n', 1 ) AS sentiment,
TO_NUMBER( REGEXP_SUBSTR( obj, '"confidence":\s*(\d+(\.\d*)?)', 1, 1, 'n', 1 ) ) AS confidence
FROM rsqfc
выход
SENTIMENT | CONFIDENCE
:-------- | ------------------:
negative | .6211975044276729
neutral | .3510681601407111
positive | .027734335431616075
PL / SQL
Или с использованием PL / SQL:
DECLARE
json CLOB := '[
{
"sentiment":"negative",
"confidence":0.6211975044276729
},
{
"confidence":0.3510681601407111,
"sentiment":"neutral"
},
{
"sentiment":"positive",
"confidence":0.027734335431616075
}
]';
cnt PLS_INTEGER;
obj VARCHAR2(4000);
sentiment VARCHAR2(20);
confidence NUMBER;
BEGIN
cnt := REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' );
FOR i IN 1 .. cnt LOOP
obj := REGEXP_SUBSTR( json, '\{(.*?)\}', 1, i, 'n' );
sentiment := REGEXP_SUBSTR( obj, '"sentiment":\s*"(negative|neutral|positive)"', 1, 1, 'n', 1 );
confidence := TO_NUMBER( REGEXP_SUBSTR( obj, '"confidence":\s*(\d+(\.\d*)?)', 1, 1, 'n', 1 ) );
DBMS_OUTPUT.PUT_LINE( sentiment || ' - ' || confidence );
END LOOP;
END;
/
выход
dbms_output:
negative - .6211975044276729
neutral - .3510681601407111
positive - .027734335431616075
дБ <> скрипка здесь