| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		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
  | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |