| 
 
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| De Mian Профи
 
 
 Вступление в Клуб: 26.09.2008
 
 | 
			
				|  Вс Авг 11, 2019 00:04   JSON \ JSON_DOM |   |  
				| Полезность: Нет оценки 
 |  
				| Интересует работа с JSON как с DOM. наподобие XML_DOM. 
 Знаю, что в своем решении WEBPROXY ЦФТ используют стороннее решение для работы взятое с https://github.com/pljson/pljson.
 Может кто-то в своей работе использует это решение или подобные ему и может поделится примером кода по вкладыванию и считыванию в\из JSON структуры наподобие такой : пара простых полей + составная структура, массив скалярных типов, массив составных структур ? пример ниже.
 
 Для чего это нужно: Есть механизм, основанный на сильном использовании макросов execute\process и перегруженных процедур, который по описанию структуры, генерирует процедуры для парсинга и сбора XML. т.е. для работы с XML достаточно описать структуру, в точности повторяющую XML и процедуры работы с XML будут созданы автоматически.
 Выглядит это примерно так - описываем структуру, описываем блок чтения полей из XML и блок вкладывания полей в XML. Поля структуры в свою очередь могут быть другими структурами или массивами структур, и для этих структур так же описаны блоки чтения\записи полей. В итоге всё програмирование заключается просто в последовательном описании структур record. т.е. по сути  описанный record становится вроде некоторой такой оснастки для взаимодействия со слоем DOM в направление чтения и записи в конкретный формат(пока только XML).
 
 На текущий момент для этих макросов существует 2 рабочих движка трансляции в код pl/sql - Это обычный XML через движек XML_DOM и через движек ЦФТ-ного интегратора (который везде ставит свои кегли BEGIN_). Есть ещё попытка работы трансляции в PL/SQL через XMLTYPE, но там для генерации XML не особо много свободы(особенно в части атрибутов), т.ч. 3-ий движек очень неказистый такой(просто для прикола).
 
 Появилась  идея реализовать 4-ый движек - чтобы структура транслировалась в JSON и JSON в структуру. Но поскольку реальных задач с JSON ещё не было, то как-то не нахожу для себя времени изучить хотя бы https://github.com/pljson/pljson. Но по готовому примеру чтения\записи вполне можно разобраться.
 
 Если есть примеры то просьба скинуть. Поделюсь потом тем что получится.
 
 
 Пример JSON :
 
  	  | Код: |  	  | {
 "firstName": "Иван",
 "lastName": "Иванов",
 "address": {
 "streetAddress": "Московское ш., 101, кв.101",
 "city": "Ленинград",
 "postalCode": "101101"
 },
 "phoneNumbers": [
 "812 123-1234",
 "916 123-4567"
 ],
 "test": [
 {
 "one": 1,
 "two": 2
 },
 {
 "one": 11,
 "two": 22
 }
 ]
 }
 
 | 
 
 Так мы "програмируем" работу с XML:
 
  	  | Код: |  	  | pragma include(::[SOME_TYPE].[GEN_XML_XMLDOM]); -- или pragma include(::[SOME_TYPE].[GEN_XML_XMLCIT]); или pragma include(::[SOME_TYPE].[GEN_XML_XMLTYPE]);
 
 type Status_rec is record(
 ErrorCode NUMBER,
 ErrorString string(2000)
 );
 &PARSE_BEGIN('Status');
 &gen_lib.&PARSE_ATTR_DATA('ErrorCode');  -- чтение аттрибута  ErrorCode
 &gen_lib.&PARSE_DATA('ErrorString'); -- чтение тега ErrorString
 &MIDDLE_PART('Status');
 &gen_lib.&GEN_ATTR_DATA('ErrorCode'); -- запись аттрибута ErrorCode
 &gen_lib.&GEN_DATA('ErrorString'); -- запись тега ErrorString
 &GEN_END('Status');
 
 type
 Client_REC is record(
 name string,
 age integer,
 status Status_rec
 );
 
 &PARSE_BEGIN('Client');
 &gen_lib.&PARSE_DATA('name'); -- чтение тега name
 &gen_lib.&PARSE_DATA('age');  -- чтение тега age
 &PARSE_DATA('status');  -- чтение тега status, и делее по описанию Status_rec чтение атрибута  ErrorCode и тега  ErrorString
 &MIDDLE_PART('Client');
 &gen_lib.&GEN_DATA('name');  -- запись тега name
 &gen_lib.&GEN_DATA('age');  -- запись тега age
 &GEN_DATA('status');  -- запись тега status, и делее по описанию Status_rec чтение атрибута  ErrorCode и тега  ErrorString
 &GEN_END('Client');
 
 | 
 
 В итоге макросы транслируются в набор перегруженных процедур, отличающиеся лишь одним параметром P_OBJ - типом обрабатываемой структуры. Эти процедуры соответственно умеют раскладывать XML в описанные структуры и записывать структуру в XML. В итоге всё программирование XML сводится к перечислению набора полей для чтения XML и для записи в XML.
 
  	  | Код: |  	  | type STATUS_REC is record (
 ERRORCODE   number,
 ERRORSTRING   varchar2(2000)
 );
 procedure PARSE_DATA(P_OBJ OUT STATUS_REC,P_CLOB IN OUT NOCOPY clob,....);
 procedure GEN_DATA(P_OBJ IN STATUS_REC,P_CLOB IN OUT NOCOPY clob.....);
 
 type CLIENT_REC is record (
 NAME   varchar2(128),
 AGE   pls_integer,
 STATUS   STATUS_REC
 );
 procedure PARSE_DATA(P_OBJ OUT CLIENT_REC,P_CLOB_IN IN clob,....);
 procedure GEN_DATA(P_OBJ IN CLIENT_REC,P_CLOB IN OUT NOCOPY clob,.....);
 
 | 
 Приведенный пример делает код для работы с XML такой структуры, но вложенность и сложность может быть любая, в том числе и с массивами структур, массивами массивов и т.п. :
 
  	  | Код: |  	  | <elm> <name>HELLO</name>
 <age>56</age>
 <status ErrorCode="56">
 <ErrorString>ERROR_BLIN</ErrorString>
 </status>
 </elm>
 | 
 
 Последний раз редактировалось: De Mian (Пн Авг 12, 2019 10:00), всего редактировалось 2 раз(а)
 |  |  
		|  |  
		| svn Профи
 
 
 Вступление в Клуб: 04.02.2008
 
 | 
			
				|  Вс Авг 11, 2019 22:59    |   |  
				| Полезность: Нет оценки 
 |  
				| В Oralce 12.2 есть встроенная поддержка JSON |  |  
		|  |  
		| De Mian Профи
 
 
 Вступление в Клуб: 26.09.2008
 
 | 
			
				|  Вс Авг 11, 2019 23:11    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | svn пишет: |  	  | В Oralce 12.2 есть встроенная поддержка JSON | 
 
  Ключевое тут >>Интересует работа с JSON как с DOM. Встроенная поддержка JSON, как и поддержка XML, работает при заранее известной структуре данных.
 в общей задаче, структура не то что не известна, а в принципе не имеет значения. И тут с данными нужно работать только через интерфейсы  к объектной модели.
 |  |  
		|  |  
		| De Mian Профи
 
 
 Вступление в Клуб: 26.09.2008
 
 | 
			
				|  Ср Авг 21, 2019 18:09    |   |  
				| Полезность: 2 
 |  
				| Всё вопрос закрыт. Объекты с GITHUB достаточно простые в использовании. написал на основе них новый движек JSON для автогениратора. Итого. теперь такой код транслируется
 
  	  | Код: |  	  | type rec1_rec is record( int1 integer:=123,
 str1 string:='HELLO',
 bool1 boolean:=TRUE,
 DAT1   DATE:=trunc(SYSdATE)
 );
 
 &PARSE_BEGIN('rec1','DECLARE_LIST');
 &gen_lib.&PARSE_DATA('int1');
 &gen_lib.&PARSE_DATA('str1');
 &gen_lib.&PARSE_DATA('bool1');
 &gen_lib.&PARSE_DATA('dat1','dd/mm/yyyy HH24:MI:SS');
 &MIDDLE_PART('rec1','LIST');
 &gen_lib.&GEN_DATA('int1');
 &gen_lib.&GEN_DATA('str1');
 &gen_lib.&GEN_DATA('bool1');
 &gen_lib.&GEN_DATA('dat1','dd/mm/yyyy HH24:MI:SS');
 &GEN_END('rec1','LIST');
 
 type rec2_rec is record(
 int2 integer:=3333,
 str2 string:='HELLOHELLO',
 bool2 boolean:=false,
 DAT2   DATE:=trunc(SYSdATE)+100,
 rec2      rec1_rec,
 list2      rec1_list
 
 );
 
 &PARSE_BEGIN('rec2','DECLARE_LIST');
 &gen_lib.&PARSE_DATA('int2');
 &gen_lib.&PARSE_DATA('str2');
 &gen_lib.&PARSE_DATA('bool2');
 &gen_lib.&PARSE_DATA('dat2','dd/mm/yyyy HH24:MI:SS');
 &PARSE_DATA('rec2');
 &PARSE_DATA('list2','item');
 &MIDDLE_PART('rec2','LIST');
 &gen_lib.&GEN_DATA('int2');
 &gen_lib.&GEN_DATA('str2');
 &gen_lib.&GEN_DATA('bool2');
 &gen_lib.&GEN_DATA('dat2','dd/mm/yyyy HH24:MI:SS');
 &GEN_DATA('rec2');
 &GEN_DATA('list2','item');
 &GEN_END('rec2','LIST');
 | 
 
 В PL/SQL код для работы(чтение, разбор,создание) примерно с таким JSON.
 
 
  	  | Код: |  	  | { "data1": {
 "data2": {
 "int2": 3333,
 "str2": "HELLOHELLO",
 "bool2": false,
 "dat2": "29/11/2019 00:00:00",
 "rec2": {
 "int1": 123,
 "str1": "HELLO",
 "bool1": true,
 "dat1": "21/08/2019 00:00:00"
 },
 "list2": [{
 "item": {
 "int1": 123,
 "str1": "HELLO",
 "bool1": true,
 "dat1": "21/08/2019 00:00:00"
 }
 }, {
 "item": {
 "int1": 123,
 "str1": "HELLO",
 "bool1": true,
 "dat1": "21/08/2019 00:00:00"
 }
 }, {
 "item": {
 "int1": 123,
 "str1": "HELLO",
 "bool1": true,
 "dat1": "21/08/2019 00:00:00"
 }
 }]
 }
 }
 }
 | 
 
 Уровень вложенности структур, массивов любой.
 буду тестить как выдастся время на быстродействие.
 |  |  
		|  |  
		| De Mian Профи
 
 
 Вступление в Клуб: 26.09.2008
 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |