当前位置: 首页 > 编程笔记 >

如何在Oracle中生成JSON数据并执行模式验证?

东郭阳德
2023-03-14
本文向大家介绍如何在Oracle中生成JSON数据并执行模式验证?,包括了如何在Oracle中生成JSON数据并执行模式验证?的使用技巧和注意事项,需要的朋友参考一下

问题:

您要生成JSON数据并在Oracle中执行模式验证。

诸如JSON_OBJECT,JSON_ARRAYAGG,JSON_QUERY之类的功能可用于使用多个列和表来生成复杂的JSON数据。

JSON_OBJECT:-它是SQL / JSON函数。JSON_OBJECT将一个或多个属性键值对作为输入。它返回一个JSON对象,其中包含每个键-值对的对象成员。

JSON_ARRAYAGG:-SQL / JSON函数JSON_ARRAYAGG是一个聚合函数。它以一列SQL表达式作为输入,将每个表达式转换为JSON值,并返回包含这些JSON值的单个JSON数组

JSON_QUERY:-JSON_QUERY在JSON数据中找到一个或多个指定的JSON值,并以字符串形式返回这些值。

可以通过两种方式对JSON数据进行模式验证。

  • 在创建将插入生成的json的表时,如下所示在列上创建约束。

  • 在选择生成的json数据时,使用条件如“ column_name IS JSON”,这将仅选择有效的JSON dat,而不会选择null。

示例

CREATE TABLE tmp_json_gen (json_data CLOB

---constraints to check if the generated JSON data is in proper format or not--
CONSTRAINT ensure_json CHECK (json_data IS JSON));
CREATE TABLE tmp_json_gen_pretty (json_data CLOB
CONSTRAINT ensure_json_pty CHECK (json_data IS JSON));

示例

DECLARE
  l_clob  CLOB;

BEGIN
FOR CUR IN (SELECT customer_id FROM customers)
 LOOP
SELECT /*json*/
 JSON_OBJECT('id' VALUE c.customer_id,
             'name' VALUE c.full_name,
             'num_orders' VALUE (SELECT COUNT(*)
                FROM orders o
               WHERE o.customer_id = c.customer_id),
             'orders' VALUE
             (SELECT JSON_ARRAYAGG(JSON_OBJECT('order_id' VALUE o.order_id,
                                               'date' VALUE o.order_datetime,
                                               'items' VALUE
                                               (SELECT JSON_ARRAYAGG(JSON_OBJECT
                                            ('id'
                                                    VALUE
                                                      i.order_id,
                                                       'name'
                                                        VALUE
                                                        i.line_item_id,
                                                         'quantity'
                                                         VALUE
                                                        i.quantity,
                                                        'price'
                                                         VALUE
                                                         i.unit_price,
                                                        'total_price'
                                                        VALUE(i.unit_price *
                                                        i.quantity)))
                                                  FROM order_items i
                                                 WHERE i.order_id = o.order_id  )    
                                             )
                                   )
                FROM orders o
               WHERE o.customer_id = c.customer_id) ABSENT ON NULL)
  INTO l_clob
  FROM customers c
 WHERE customer_id = '' || CUR.customer_id || '';

示例

INSERT INTO tmp_json_gen VALUES(l_clob);
COMMIT;
END LOOP;

INSERT INTO tmp_json_gen_pretty
WITH tmp AS
   (SELECT JSON_QUERY(json_data, '$' pretty) AS json_data FROM tmp_json_gen)
SELECT * FROM tmp WHERE json_data IS JSON;

COMMIT;
END;

输出结果

{
    "id" : 21,
    "name" : "Martha Baker",
    "num_orders" : 4,
    "orders" :
    [
      {
        "order_id" : 1775,
        "date" : "2019-03-03T18:44:22.601072",
        "items" :
        [
          {
            "id" : 1775,
            "name" : 1,
            "quantity" : 2,
            "price" : 29.51,
            "total_price" : 59.02
          },
          {
            "id" : 1775,
            "name" : 2,
            "quantity" : 4,
            "price" : 44.17,
            "total_price" : 176.68
          }
        ]
      },
      {
        "order_id" : 1807,
        "date" : "2019-03-09T09:16:47.441189",
        "items" :
        [
          {
            "id" : 1807,
            "name" : 1,
            "quantity" : 3,
            "price" : 48.39,
            "total_price" : 145.17
          },
          {
            "id" : 1807,
            "name" : 2,
            "quantity" : 2,
            "price" : 38.28,
            "total_price" : 76.56
          }
        ]
      },
      {
        "order_id" : 1824,
        "date" : "2019-03-12T23:56:53.384122",
        "items" :
        [
          {
            "id" : 1824,
            "name" : 1,
            "quantity" : 2,
            "price" : 11,
            "total_price" : 22
          },
          {
            "id" : 1824,
            "name" : 2,
            "quantity" : 3,
            "price" : 10.48,
            "total_price" : 31.44
          },
          {
            "id" : 1824,
            "name" : 3,
            "quantity" : 3,
            "price" : 43.71,
            "total_price" : 131.13
          }
        ]
      },
      {
        "order_id" : 1134,
        "date" : "2018-11-18T07:46:53.922156",
        "items" :
        [
          {
            "id" : 1134,
            "name" : 1,
            "quantity" : 3,
            "price" : 48.39,
            "total_price" : 145.17
          },
          {
            "id" : 1134,
            "name" : 2,
            "quantity" : 4,
            "price" : 49.12,
            "total_price" : 196.48
          }
        ]
      }
    ]
  }
 类似资料:
  • 问题内容: 我们有这个json模式草稿。我想获取我的JSON数据的样本并为JSON模式生成一个框架,该框架可以手动进行修改,添加诸如description,required之类的内容,而这些不能从特定的示例中推断出来。 例如,从我的输入: 我将运行json_schema_g​​enerator工具,并得到: 此示例已手动编码,因此可能存在错误。有没有什么工具可以帮助我进行JSON转换-> JSON

  • 据我所知,有一些方法可以根据RDF模式验证序列化的RDF(例如RDF/XML)(如何用您的RDF模式验证RDF)。还有,从RDF/XML到JSON-LD序列化格式的各种转换器(反之亦然)。在Internet上搜索,我找不到一种直接的方法来验证JSON-LD与某种JSON模式的关系,就像RDF模式与RDF(/XML)的关系一样。当然,有各种各样的JSON-LD文档表单,所以我假设一个模式不能很容易地

  • java中有什么包可以做到这一点吗?我可以使用https://github.com/everit-org/json-schema之类的东西吗?或者这只是根据json文档的模式来验证它吗? 多谢了。

  • 在我的客户机代码中,我使用json模式来验证json响应(使用ajv)。我正计划使用pact-js生成pacts,以便对提供者运行以进行契约测试。 我希望我的客户机代码在运行时验证期间使用的模式和契约测试在协议验证期间使用的模式有一个真实的来源。是否有一种方法可以从pact文件生成json(或swagger)模式,或者是否有一个库使用pact文件本身来对单个http响应进行运行时验证(而不是仅仅用

  • 问题内容: 有没有一种方法可以针对该结构的JSON模式验证JSON结构?我已经查看并发现JSON.Net验证了,但这并不能满足我的要求。 JSON.net可以: 这证明是正确的。 这也证明是真的 仅此验证为假。 理想情况下,我希望它可以验证那里也没有应该存在的字段。 问题答案: 我认为您只需要添加 到您的架构。这将停止提供未知属性。 因此,现在您的结果将是:-正确,错误,错误 测试代码… 输出:-

  • 这是要根据模式验证的JSON。 问题是,如果我们传递了错误的数据,它将正确地验证eid和ename的类型(即整数或字符串)。对于例如: 如果我们为限定传递了错误的类型,那么它将验证为true(即,它不验证限定的类型,可能是因为它是嵌套的)。