JSON就是一种数据格式;比如有一个txt文本文件,用来存放一个班级的成绩;规定此文本文件里的学生成绩的格式,是第一行,就是一行列头(姓名 班级 年级 科目 成绩),接下来,每一行就是一个学生的成绩。

这个文本文件内的信息存放格式,其实就是一种数据格式。

学生 班级 年级 科目 成绩 
张三 一班 大一 高数 90 
李四 二班 大一 高数 80 

对应到JSON,它其实也是代表了一种数据格式,所谓数据格式,就是数据组织的形式。
比如说,刚才所说的学生成绩,用JSON格式来表示的话,如下:[{“学生”:“张三”, “班级”:“一班”, “年级”:“大一”, “科目”:“高数”, “成绩”:90}, {“学生”:“李四”, “班级”:“二班”, “年级”:“大一”, “科目”:“高数”, “成绩”:80}]
其实,JSON,很简单,一点都不复杂,就是对同样一批数据的,不同的一种数据表示的形式。

JSON的数据语法,其实很简单:
如包含多个数据实体的话,比如说多个学生成绩,需使用数组的表现形式,就是[]。对于单个数据实体,比如一个学生的成绩,那么使用一个{}来封装数据,对于数据实体中的每个字段以及对应的值,使用key:value的方式来表示,多个key-value对之间用逗号分隔;多个{}代表的数据实体之间,用逗号分隔。

Oracle方面:

Multi-model(多模)数据库,指的是在一个数据库中,可以同时支持多种存储引擎或存储类型,为应用提供各种数据服务,如下图所示:
image.png
Oracle数据库对于这几种存储格式都能够进行很好的支持,在Oracle 19c中,可使用JSON数据格式。
JSON数据格式在Oracle 12.1.0.2中就开始支持了,也就是说在Oracle数据库中,你可以存储、查询JSON数据格式,像访问普通的表一样,进行增删改操作、创建索引、创建虚拟列等,甚至可以把它放在内存数据库中(In-Memory)提高性能。

虽然JSON数据格式在Oracle 12.1.0.2中就开始支持,但在Oracle 19c以前,如果要更新JSON文档的某部分,你必须检索JSON文档,更新内容后要把整个文档替换为修改后的文档。现在,19C可以通过JSON_MERGEPATCH大大简化此过程。

在12c中早已支持对JSON文档创建索引,添加虚拟列、把JSON文档加载到 In-Memory中提高性能等等。
具体请参考手册《JSON Developer’s Guide》,链接如下:
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/

官方举例:
Example 4-1 Using IS JSON in a Check Constraint to Ensure JSON Data is Well-Formed

CREATE TABLE j_purchaseorder
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   date_loaded TIMESTAMP (6) WITH TIME ZONE,
   po_document VARCHAR2 (23767)
   CONSTRAINT ensure_json CHECK (po_document IS JSON));

Example 4-2 Inserting JSON Data Into a VARCHAR2 JSON Column

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-DEC-2014'),
    '{"PONumber"             : 1600,
      "Reference"            : "ABULL-20140421",
      "Requestor"            : "Alexis Bull",
      "User"                 : "ABULL",
      "CostCenter"           : "A50",
      "ShippingInstructions" :
        {"name"    : "Alexis Bull",
         "Address" : {"street"  : "200 Sporting Green",
                      "city"    : "South San Francisco",
                      "state"   : "CA",
                      "zipCode" : 99236,
                      "country" : "United States of America"},
         "Phone"   : [{"type" : "Office", "number" : "909-555-7307"},
                      {"type" : "Mobile", "number" : "415-555-1234"}]},
      "Special Instructions" : null,
      "AllowPartialShipment" : true,
        [{"ItemNumber" : 1,
          "Part"       : {"Description" : "One Magic Christmas",
                          "UnitPrice"   : 19.95,
                          "UPCCode"     : 13131092899},
          "Quantity"   : 9.0},
         {"ItemNumber" : 2,
          "Part"       : {"Description" : "Lethal Weapon",
                          "UnitPrice"   : 19.95,
                          "UPCCode"     : 85391628927},
          "Quantity"   : 5.0}]}');

INSERT INTO j_purchaseorder
  VALUES (
    SYS_GUID(),
    to_date('30-DEC-2014'),
    '{"PONumber"             : 672,
      "Reference"            : "SBELL-20141017",
      "Requestor"            : "Sarah Bell",
      "User"                 : "SBELL",
      "CostCenter"           : "A50",
      "ShippingInstructions" : {"name"    : "Sarah Bell",
                                "Address" : {"street"  : "200 Sporting Green",
                                             "city"    : "South San Francisco",
                                             "state"   : "CA",
                                             "zipCode" : 99236,
                                             "country" : "United States of America"},
                                "Phone"   : "983-555-6509"},
      "Special Instructions" : "Courier",
      "LineItems"            :
        [{"ItemNumber" : 1,
          "Part"       : {"Description" : "Making the Grade",
                          "UnitPrice"   : 20,
                          "UPCCode"     : 27616867759},
          "Quantity"   : 8.0},
         {"ItemNumber" : 2,
          "Part"       : {"Description" : "Nixon",
                          "UnitPrice"   : 19.95,
                          "UPCCode"     : 717951002396},
          "Quantity"   : 5},
         {"ItemNumber" : 3,
          "Part"       : {"Description" : "Eric Clapton: Best Of 1981-1999",
                          "UnitPrice"   : 19.95,
                          "UPCCode"     : 75993851120},
          "Quantity"   : 5.0}]}');

Oracle 19C 如何加载外部JSON数据?
具体详看如下链接:
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/loading-external-json-data.html#GUID-52EFC452-5E65-4148-8070-1FA588A6E697

Example 12-3 Creating a Table With a BLOB JSON Column

Table j_purchaseorder has primary key id and JSON column po_document, which is stored using data type BLOB. The LOB cache option is turned on for that column.

DROP TABLE j_purchaseorder;

CREATE TABLE j_purchaseorder
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   date_loaded TIMESTAMP (6) WITH TIME ZONE,
   po_document BLOB
   CONSTRAINT ensure_json CHECK (po_document IS JSON))
  LOB (po_document) STORE AS (CACHE);
Example 12-4 Copying JSON Data From an External Table To a Database Table

INSERT INTO j_purchaseorder (id, date_loaded, po_document)
  SELECT SYS_GUID(), SYSTIMESTAMP, json_document FROM json_dump_file_contents
    WHERE json_document IS JSON;

看到这里就明白了,要向更好的使用Oracle的存储格式,强烈建议使用19C

在19c中,可以创建包含JSON_TABLE的物化视图,增强了查询重写的功能。当JSON文档中包含数组时,特别有用,物化视图可以为JSON数组提供快速访问性能。

开发方面

阿里的fastjson工具包。使用这个工具包,可以方便的将字符串类型的JSON数据,转换为一个JSONObject对象,然后通过其中的getX()方法,获取指定的字段的值。

创建fastjson测试类
在包`com.erik.sparkproject.test下新建fastjson测试类FastjsonTest.java

package com.erik.sparkproject.test;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * fastjson测试类
 * @author Erik
 *
 */
public class FastjsonTest {
    public static void main(String[] args) {
        String json = "[{'学生':'张三','班级':'一班','年级':'大一','科目':'高数','成绩':90},"
                + "{'学生':'李四','班级':'二班','年级':'大一','科目':'高数','成绩':80}]";

        JSONArray jsonArray = JSONArray.parseArray(json);
        JSONObject jsonObject = jsonArray.getJSONObject(0);
        System.out.println(jsonObject.getString("学生"));
    }
}

【参考】
https://www.modb.pro/db/14097
【参考】
https://blog.csdn.net/u012318074/article/details/60607077
【参考】
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/
【参考】
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/loading-external-json-data.html#GUID-52EFC452-5E65-4148-8070-1FA588A6E697

文章结束。

以下是个人微信公众号,欢迎关注:
image.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐