APEX_JSON получить объект массива - PullRequest
0 голосов
/ 05 мая 2018
declare
       l_json_doc VARCHAR2(32767); 
       l_numcols number;
       l_numrows number;      
begin

l_json_doc := '{
    "table": {
        "name": "sometablename",
        "numofcolumns": 5,
        "numofrows": 5,
        "colheadings": [{
                "colname": "customcol1",
                "coltype": "number"
            },
            {
                "colname": "customcol2",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol3",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol4",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol5",
                "coltype": "number"
            }
        ],
        "data": [{
                "customcol1": "datacolumn1",
                "customcol2": "datacolumn2",
                "customcol3": "datacolumn3",
                "customcol4": "datacolumn4",
                "customcol5": "datacolumn5"
            },
            {
                "customcol1": "2datacolumn1",
                "customcol2": "2datacolumn2",
                "customcol3": "2datacolumn3",
                "customcol4": "2datacolumn4",
                "customcol5": "2datacolumn5"
            },
            {
                "customcol1": "3datacolumn1",
                "customcol2": "3datacolumn2",
                "customcol3": "3datacolumn3",
                "customcol4": "3datacolumn4",
                "customcol5": "3datacolumn5"
            },
            {
                "customcol1": "4datacolumn1",
                "customcol2": "4datacolumn2",
                "customcol3": "4datacolumn3",
                "customcol4": "4datacolumn4",
                "customcol5": "4datacolumn5"
            }
        ]
    }
}';

APEX_JSON.parse(l_json_doc);

l_numcols := APEX_JSON.get_count(p_path => 'table.colheadings');

l_numrows := APEX_JSON.get_count(p_path => 'table.data');

FOR i IN 1 .. l_numrows LOOP
FOR j IN 1 .. l_numcols LOOP

dbms_output.put_line('TEST ' || APEX_JSON.get_varchar2(p_path => 'table.data[%d]')  ); 

END LOOP;
END LOOP;


end;

Это мой код, который должен извлекать объекты массива данных. Я ожидаю следующий вывод:

TEST {"customcol1": "datacolumn1","customcol2": "datacolumn2","customcol3": "datacolumn3","customcol4": "datacolumn4","customcol5": "datacolumn5"}

TEST { "customcol1": "2datacolumn1","customcol2": "2datacolumn2","customcol3": "2datacolumn3","customcol4": "2datacolumn4","customcol5": "2datacolumn5"}

и т.д ...

Но когда я пытаюсь получить объект json из массива данных, используя APEX_JSON.get_varchar2, он возвращает пустой

1 Ответ

0 голосов
/ 09 мая 2018

Две проблемы с кодом есть

  • Вы не указали индекс для функции get_varchar2. Так что путь не полный. Вам необходимо указать значение в параметре p0 этой функции
  • Это не так, как APEX_JSON.get_varchar2 работает. Вы ожидаете функция для возврата всего объекта JSON в массиве данных, но get_varchar2 не может этого сделать. Он может получить только VALUE , который является VARCHAR по указанному пути. Он не может получить весь объект.

Для вашего вывода

DECLARE
   l_json_doc   VARCHAR2 (32767);
   l_numcols    NUMBER;
   l_numrows    NUMBER;
   v_colname    VARCHAR2 (32767);
BEGIN
   l_json_doc := '{
    "table": {
        "name": "sometablename",
        "numofcolumns": 5,
        "numofrows": 5,
        "colheadings": [{
                "colname": "customcol1",
                "coltype": "number"
            },
            {
                "colname": "customcol2",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol3",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol4",
                "coltype": "varchar2"
            },
            {
                "colname": "customcol5",
                "coltype": "number"
            }
        ],
        "data": [{
                "customcol1": "datacolumn1",
                "customcol2": "datacolumn2",
                "customcol3": "datacolumn3",
                "customcol4": "datacolumn4",
                "customcol5": "datacolumn5"
            },
            {
                "customcol1": "2datacolumn1",
                "customcol2": "2datacolumn2",
                "customcol3": "2datacolumn3",
                "customcol4": "2datacolumn4",
                "customcol5": "2datacolumn5"
            },
            {
                "customcol1": "3datacolumn1",
                "customcol2": "3datacolumn2",
                "customcol3": "3datacolumn3",
                "customcol4": "3datacolumn4",
                "customcol5": "3datacolumn5"
            },
            {
                "customcol1": "4datacolumn1",
                "customcol2": "4datacolumn2",
                "customcol3": "4datacolumn3",
                "customcol4": "4datacolumn4",
                "customcol5": "4datacolumn5"
            }
        ]
    }
}';

   APEX_JSON.parse (l_json_doc);

   l_numcols := APEX_JSON.get_count (p_path => 'table.colheadings');

   l_numrows := APEX_JSON.get_count (p_path => 'table.data');

   FOR i IN 1 .. l_numrows
   LOOP
      DBMS_OUTPUT.put ('TEST {');

      FOR j IN 1 .. l_numcols
      LOOP
         v_colname :=
            apex_json.get_varchar2 ('table.colheadings[%d].colname', j);
         DBMS_OUTPUT.put (
            '"' || v_colname || '":"'
            || APEX_JSON.get_varchar2 (
                  p_path   => 'table.data[%d].' || v_colname,
                  p0       => i)
            || '",');
      END LOOP;

      DBMS_OUTPUT.put_line ('}');
   END LOOP;
END;

Вот вывод кода:

TEST {"customcol1":"datacolumn1","customcol2":"datacolumn2","customcol3":"datacolumn3","customcol4":"datacolumn4","customcol5":"datacolumn5",}
TEST {"customcol1":"2datacolumn1","customcol2":"2datacolumn2","customcol3":"2datacolumn3","customcol4":"2datacolumn4","customcol5":"2datacolumn5",}
TEST {"customcol1":"3datacolumn1","customcol2":"3datacolumn2","customcol3":"3datacolumn3","customcol4":"3datacolumn4","customcol5":"3datacolumn5",}
TEST {"customcol1":"4datacolumn1","customcol2":"4datacolumn2","customcol3":"4datacolumn3","customcol4":"4datacolumn4","customcol5":"4datacolumn5",}

ПРИМЕЧАНИЕ : мне было все равно, чтобы удалить запятую после последней пары ключ: значение в каждой строке. Если вы хотите этого, вы должны сохранить все пары ключ-значение в переменной и RTRIM запятую.

...