首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获得正确的pljson语法。

无法获得正确的pljson语法。
EN

Stack Overflow用户
提问于 2014-12-30 16:21:51
回答 1查看 631关注 0票数 0

我在Oracle Xe 11g中安装了pljson 1.05,并编写了一个PLSQL函数,从Amazon描述实例的返回中提取值。

尝试获取顶级项的值,如保留ID工作,但我无法获得嵌套在json较低级别中的值。

例如,这个示例工作正常(使用内联的剪裁AWS JSON

代码语言:javascript
复制
  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;

返回

代码语言:javascript
复制
============
------------
{
"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

但是这个返回实例ID的示例没有

代码语言:javascript
复制
  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;

返回

代码语言:javascript
复制
============
------------
{
"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,但这段代码没有将实例ID填充到l_id中,因此不会在DBMS_OUTPUT上输出。

如果我只使用'InstanceId‘,也会得到相同的结果(即在L_id中没有值)。

我的假设和从阅读示例中可以看出,JSON路径应该允许我使用嵌套值的点表示法来选择值,但它似乎不起作用。如果输入JSON_LIST,我还尝试将“实例”提取到临时变量中,然后从那里访问它,但也无法获得一个工作示例。

任何帮助都很感激。非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-31 00:49:49

ex8.sql。它特别指出:

用于PL/ JSON的JSON路径:

  • 从不引发异常(相反,返回null)
  • 数组是1索引的。
  • 使用点在json范围内导航。
  • 空字符串作为路径返回整个json对象。
  • JSON路径只使用JSON作为输入。
  • 支持7 get类型: string、number、bool、null、json、json_list和date!
  • 内部的空间并不重要,但重要的是其他方面。

因此,你的道路应该是:

代码语言:javascript
复制
l_id := json_ext.get_string(instance, 'Instances[1].InstanceId');

或者,不直接使用json_ext

代码语言:javascript
复制
l_id := instance.path('Instances[1].InstanceId');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27708880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档