Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить json(глубина не известна), залить в таблицу / 24 сообщений из 24, страница 1 из 1
24.04.2018, 16:50
    #39635525
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
Всем привет.

Есть json содержащий иерархию каталогов.
С течением времени depth может меняться, ключи известны: "name", "subfolders".

Мне передают этот json, я должен распарсить его и залить в табличку с такой структурой:
dir number
, dir_parent number
,description varchar2

Не врубаюсь как это сделать, если глубина заведомо неизвестна.

Натолкните на мысль или поделитесь примером, пожалуйста.

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
...
Рейтинг: 0 / 0
24.04.2018, 16:53
    #39635528
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamir,

Пример JSONа приведи.

SY.
...
Рейтинг: 0 / 0
24.04.2018, 16:55
    #39635529
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
SY,

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
{
    "name": "root_folder",
    "subfolders": [
        {
            "name": "folder1",
            "subfolders": [
                {
                    "name": "folder1_1",
                    "subfolders": []
                },
                {
                    "name": "folder1_2",
                    "subfolders": [
                        {
                            "name": "folder1_2_1",
                            "subfolders": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "folder2",
            "subfolders": []
        },
        {
            "name": "folder3",
            "subfolders": []
        }
    ]
}
...
Рейтинг: 0 / 0
24.04.2018, 17:11
    #39635538
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamir,
даже лень писать. либо рекурсивный with либо рекурсивная же функция в зависимости от того где и что надо.
...
Рейтинг: 0 / 0
24.04.2018, 19:08
    #39635644
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamir,

Дальше сам допилишь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
with r(
       parent_folder_name,
       folder_name,
       subfolders
      ) as (
             select  null,
                     t.j.name,
                     t.j.subfolders
               from  tbl t
            union all
             select  r.folder_name,
                     jt.folder_name,
                     jt.subfolders
               from  r r,
                     json_table(
                                r.subfolders,'$[*]'
                                columns(
                                        folder_name varchar2(15) path '$.name',
                                        subfolders varchar2(4000) format json path '$.subfolders'
                                       )
                               ) jt
               where r.subfolders != '[]'
           )
select  parent_folder_name,
        folder_name
  from  r
/

PARENT_FOLDER_NAME   FOLDER_NAME
-------------------- ---------------
                     root_folder
root_folder          folder1
root_folder          folder2
root_folder          folder3
folder1              folder1_1
folder1              folder1_2
folder1_2            folder1_2_1

7 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
24.04.2018, 19:50
    #39635651
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
Правда тут и выяснятся что JSON_TABLE в Oracle заточен на статику и в отличие от XMLTABLE не дает вытащить ничего длиннее VARCHAR2(4000), т.е. если есть "sub-JSON" пoльзуйся статическим NESTED PATH. Так-что если subfolders > 4000 байт то труба
и придется парсить вручную.

SY.
...
Рейтинг: 0 / 0
24.04.2018, 22:10
    #39635702
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamir,

не надо мучиться с json - проще конвертнуть в xml и разобрать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select
   parent,name
from xmltable('//name'
              passing apex_json.to_xmltype(:твой_json)
              columns
                parent varchar2(100) path './../../../name'
               ,name  varchar2(100) path '.'
             ) x;


пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
select
   parent,name
from xmltable('//name'
              passing apex_json.to_xmltype(
--начало JSON:
q'#
{
    "name": "root_folder",
    "subfolders": [
        {
            "name": "folder1",
            "subfolders": [
                {
                    "name": "folder1_1",
                    "subfolders": []
                },
                {
                    "name": "folder1_2",
                    "subfolders": [
                        {
                            "name": "folder1_2_1",
                            "subfolders": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "folder2",
            "subfolders": []
        },
        {
            "name": "folder3",
            "subfolders": []
        }
    ]
}
#' -- конец JSON
              )
              columns
                parent varchar2(100) path './../../../name'
               ,name  varchar2(100) path '.'
             ) x;

PARENT                         NAME
------------------------------ ------------------------------
                               root_folder
root_folder                    folder1
folder1                        folder1_1
folder1                        folder1_2
folder1_2                      folder1_2_1
root_folder                    folder2
root_folder                    folder3

7 rows selected.

...
Рейтинг: 0 / 0
25.04.2018, 07:26
    #39635763
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtender
Код: plsql
1.
apex_json

Ага.
...
Рейтинг: 0 / 0
25.04.2018, 07:54
    #39635783
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
SY,

Спасибо за помощь!
...
Рейтинг: 0 / 0
25.04.2018, 07:55
    #39635785
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtender,


Спасибо за помощь!
...
Рейтинг: 0 / 0
25.04.2018, 13:44
    #39636018
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtender,

А что APEX уже лицензии не требует?

SY.
...
Рейтинг: 0 / 0
25.04.2018, 14:04
    #39636035
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
SY,

А что раньше требовало?
...
Рейтинг: 0 / 0
25.04.2018, 14:37
    #39636054
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtenderА что раньше требовало?

APEX не пользую. Был уверен что требует. Сейчас посмотрел - требует только если нет лицензионной базы.

SY.
...
Рейтинг: 0 / 0
25.04.2018, 15:39
    #39636118
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
SY Сейчас посмотрел - требует только если нет лицензионной базы.
Ээээ... "покупая у нас APEX за деньги вы признаетесь, что используете нелицензионную БД"?
:)
...
Рейтинг: 0 / 0
25.04.2018, 22:40
    #39636418
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtender,

Перерыл документацию, так и не понял, как работает xquery в случае с parent. './../../../name' - 4 уровня.
Я добавил еще несколько уровней в JSON из примера, твой запрос парсит и их, хотя я ожидал увидеть NULL'ы
Объясни, пожалуйста, как это работает, почему именно 4 уровня('./../../../name') указал?
...
Рейтинг: 0 / 0
25.04.2018, 22:48
    #39636421
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamirxtender,

Перерыл документацию, так и не понял, как работает xquery в случае с parent. './../../../name' - 4 уровня.


На 3 уровня вверх а не на 4. Чтобы это понять нужно посмотреть сгенерированный XML. Там будет что-то типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <name>root_folder</name>
   <subfolders>
      <element>
         <name>folder1</name>
         <subfolders>
            <element>
               <name>folder1_1</name>
               <subfolders />
            </element>
...



T.e. если мы от текущего name (например folder1_1) поднимемся на './../../../name' то попадем на name папашки (folder1).

SY.
...
Рейтинг: 0 / 0
26.04.2018, 08:10
    #39636513
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
SY,

SYНа 3 уровня вверх а не на 4.


Здесь все прояснилось)
Большое спасибо, SY!
...
Рейтинг: 0 / 0
27.04.2018, 08:36
    #39637119
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
WITH cte AS ( 
      select
         parent,name,ROWNUM rn
      from xmltable('//name'
                    passing apex_json.to_xmltype(
      --начало JSON:
      q'#
      {
          "name": "root_folder",
          "subfolders": [
              {
                  "name": "folder1",
                  "subfolders": [
                      {
                          "name": "folder1_1",
                          "subfolders": []
                      },
                      {
                          "name": "folder1_2",
                          "subfolders": [
                              {
                                  "name": "folder1_2_1",
                                  "subfolders": []
                              }
                          ]
                      }
                  ]
              },
              {
                  "name": "folder2",
                  "subfolders": []
              },
              {
                  "name": "folder3",
                  "subfolders": []
              }
          ]
      }
      #' -- конец JSON
                    )
                    columns
                      parent varchar2(100) path './../../../name'
                     ,name  varchar2(100) path '.'
                   ) x),
    cte2 AS (
     SELECT c1.name, c1.rn id_dir, c2.rn id_parent_dir
       FROM cte c1
  LEFT JOIN cte c2      
         ON c1.parent = c2.name)
    SELECT c2.*
          ,sys_connect_by_path(c2.name, '\') fullpath
      FROM cte2 c2
     START WITH c2.id_parent_dir IS NULL
   CONNECT BY PRIOR c2.id_dir = c2.id_parent_dir



Хочу получить fullpath.
Поскольку xquery почти не знаю и в данный момент нет времени на изучение, решил использовать sys_connect_by_path.
Не понимаю почему в результате в id_parent_dir null, fullpath'ы не построены.
Но, если данные из cte2 залить в таблицу и уже на ее основе строить запрос, отрабатывает правильно.

Грешу на:
1)Не знаю нюансов xmltable
2)Трансформации
3)Баг(?)

Прошу помощи, ткните носом в доку, блог и т.д. или объясните, пожалуйста.
...
Рейтинг: 0 / 0
27.04.2018, 13:20
    #39637416
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
israelshamir3)Баг(?)да, но вообще не нужно их смешивать, достаточно xmltable:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
WITH 
 xmldata as (
      select
        apex_json.to_xmltype(
      --начало JSON:
      q'#
      {
          "name": "root_folder",
          "subfolders": [
              {
                  "name": "folder1",
                  "subfolders": [
                      {
                          "name": "folder1_1",
                          "subfolders": []
                      },
                      {
                          "name": "folder1_2",
                          "subfolders": [
                              {
                                  "name": "folder1_2_1",
                                  "subfolders": []
                              }
                          ]
                      }
                  ]
              },
              {
                  "name": "folder2",
                  "subfolders": []
              },
              {
                  "name": "folder3",
                  "subfolders": []
              }
          ]
      }
      #' -- конец JSON
      ) as xmldata
      from dual
 )
,cte AS (
      select--+ no_merge 
         id_dir, 
         parent, 
         name,
         path,
         xpath,
         nvl2(ltrim(xpath_parent,'/'),ltrim(xpath_parent,'/')||'/name','') xpath_parent
      from xmldata,
           xmltable('//name'
                    passing xmldata.xmldata
                    columns
                      id_dir for ordinality
                     ,parent varchar2(100) path './../../../name'
                     ,name  varchar2(100) path '.'
                     ,path varchar2(100) path 'string-join(ancestor-or-self::*/name, "/")'
                     ,xpath varchar2(100) path 'string-join(ancestor-or-self::*/name(.), "/")'
                     ,xpath_parent varchar2(100) path 'string-join(ancestor-or-self::*/name(./../../..), "/")'
                   ) x
 )
select
 c.*
from cte c


ps. я специально убрал этот длиннющий json и трансформацию в xmldata, чтобы не мешал читать параметры xmltable. Если хочешь можешь вернуть...
...
Рейтинг: 0 / 0
27.04.2018, 14:45
    #39637504
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
xtender,

Какая красота...
Огромное спасибо за помощь.
Позже изучу SQL/XML, SQL/JSON, xquery.
...
Рейтинг: 0 / 0
15.06.2018, 15:52
    #39661358
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
коллеги, apex_json как ставится? с админов требовать?
у нас оракл честно купленный
...
Рейтинг: 0 / 0
15.06.2018, 17:52
    #39661419
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
Пусть ставят апекс, он с ним и придёт
...
Рейтинг: 0 / 0
15.06.2018, 18:03
    #39661423
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
...
Рейтинг: 0 / 0
15.06.2018, 23:47
    #39661484
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить json(глубина не известна), залить в таблицу
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить json(глубина не известна), залить в таблицу / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]