2014-12-30 2 views
0

Я установил pljson 1.05 в Oracle Xe 11g и написал функцию PLSQL для извлечения значений из возврата из экземпляров Amazon AWS-экземпляров.не может получить правильный синтаксис для pljson

Попытка получить значения для элементов верхнего уровня, таких как идентификатор резервирования, но я не могу получить значения, вложенные в нижние уровни json.

например. Этот пример работает (с использованием урезывание AWS JSON инлайн

DECLARE 
    reservations JSON_LIST; 
    l_tempobj  JSON; 
    instance  JSON; 
    L_id   VARCHAR2(20); 
    BEGIN 
     obj:= json('{ 
     "Reservations": [ 
      { 
       "ReservationId": "r-5a33ea1a", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "stopped" 
         }, 
         "InstanceId": "i-7e02503e" 
        } 
       ] 
      }, 
      { 
       "ReservationId": "r-e5930ea5", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "running" 
         }, 
         "InstanceId": "i-77859692" 
        } 
       ] 
      } 
     ] 
     }'); 
     reservations := json_list(obj.get('Reservations')); 
     l_tempobj := json(reservations); 
     DBMS_OUTPUT.PUT_LINE('============'); 
     FOR i IN 1 .. l_tempobj.count 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('------------'); 
      instance := json(l_tempobj.get(i)); 
      instance.print; 
      l_id := json_ext.get_string(instance, 'ReservationId'); 
     DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id); 
    END LOOP; 
    END; 

возвращающегося

============ 
------------ 
{ 
"ReservationId" : "r-5a33ea1a", 
"Instances" : [{ 
"State" : { 
"Name" : "stopped" 
}, 
"InstanceId" : "i-7e02503e" 
}] 
} 
1] Instance:r-5a33ea1a 
------------ 
{ 
"ReservationId" : "r-e5930ea5", 
"Instances" : [{ 
"State" : { 
"Name" : "running" 
}, 
"InstanceId" : "i-77859692" 
}] 
} 
2] Instance:r-e5930ea5 

, но этот пример, чтобы вернуть идентификатор экземпляра Doesnt

DECLARE 
    l_clob  CLOB; 
    obj   JSON; 
    reservations JSON_LIST; 
    l_tempobj  JSON; 
    instance  JSON; 
    L_id   VARCHAR2(20); 
    BEGIN 
     obj:= json('{ 
     "Reservations": [ 
      { 
       "ReservationId": "r-5a33ea1a", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "stopped" 
         }, 
         "InstanceId": "i-7e02503e" 
        } 
       ] 
      }, 
      { 
       "ReservationId": "r-e5930ea5", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "running" 
         }, 
         "InstanceId": "i-77859692" 
        } 
       ] 
      } 
     ] 
     }'); 
     reservations := json_list(obj.get('Reservations')); 
     l_tempobj := json(reservations); 
     DBMS_OUTPUT.PUT_LINE('============'); 
     FOR i IN 1 .. l_tempobj.count 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('------------'); 
      instance := json(l_tempobj.get(i)); 
      instance.print; 
      l_id := json_ext.get_string(instance, 'Instances.InstanceId'); 
     DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id); 
    END LOOP; 
END; 

возвращающиеся

============ 
------------ 
{ 
"ReservationId" : "r-5a33ea1a", 
"Instances" : [{ 
"State" : { 
"Name" : "stopped" 
}, 
"InstanceId" : "i-7e02503e" 
}] 
} 
1] Instance: 
------------ 
{ 
"ReservationId" : "r-e5930ea5", 
"Instances" : [{ 
"State" : { 
"Name" : "running" 
}, 
"InstanceId" : "i-77859692" 
}] 
} 
2] Instance: 

только с Первый пример второй заменяет «ReservationId» на «Instances.InstanceId», но во втором примере, хотя функция завершается успешно, и оператор instance.print выводит полный json, этот код не заполняет идентификатор экземпляра в l_id, вывода на DBMS_OUTPUT.

Я также получаю тот же результат (т. Е. Нет значения в L_id), если я просто использую «InstanceId».

Мое предположение и чтение примеров, предложенных JSON PATH, должны позволять мне выбирать значения, используя либо точечную нотацию для вложенных значений, но она, похоже, не работает. Я также попытался извлечь «экземпляры» в временную переменную, если тип JSON_LIST, а затем доступ к ней оттуда, но также не смог получить рабочий пример.

Любая помощь приветствуется. Большое спасибо.

ответ

1

См. ex8.sql. В частности, он говорит:

JSON Путь для PL/JSON:

  • никогда не вызывает исключение (нуль вместо этого возвращается)
  • массивы 1 индексированные
  • использование точек для навигации через области json.
  • пустая строка как путь возвращает весь объект json.
  • JSON Path работает только с JSON в качестве входного сигнала.
  • Поддерживаются типы: string, number, bool, null, json, json_list и date!
  • пространства внутри [], не важно, но важно, иначе

Таким образом, ваш путь должен быть:

l_id := json_ext.get_string(instance, 'Instances[1].InstanceId'); 

Или, без непосредственного использования json_ext:

l_id := instance.path('Instances[1].InstanceId'); 
+1

Да, нам нужно собрать этот материал в документации.Если вы готовы помочь - github.com/pljson/pljson –

Смежные вопросы