【问题标题】:cannot get correct syntax for pljson无法获得正确的 pljson 语法
【发布时间】:2014-12-30 16:21:51
【问题描述】:

我在 Oracle Xe 11g 中安装了 pljson 1.05,并编写了一个 PLSQL 函数来从 Amazon AWS describe-instances 的返回中提取值。

尝试获取顶级项目的值,例如保留 ID 工作,但我无法获取嵌套在较低级别 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

但是这个例子没有返回实例ID

  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 中的实例 ID 因此不会在 DBMS_OUTPUT 上输出。

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

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

任何帮助表示赞赏。非常感谢。

【问题讨论】:

    标签: amazon-web-services jsonpath pljson


    【解决方案1】:

    ex8.sql。特别是,它说:

    PL/JSON 的 JSON 路径:

    • 从不引发异常(而是返回 null)
    • 数组是 1-indexed
    • 使用点在 json 范围内导航。
    • 空字符串作为路径返回整个json对象。
    • JSON 路径仅适用于 JSON 作为输入。
    • 支持 7 种获取类型: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');
    

    【讨论】:

    • 是的,我们需要在文档中整理这些内容。如果你愿意帮忙——github.com/pljson/pljson
    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多