本文来自李明子csdn博客(http://blog.youkuaiyun.com/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!
1 引子
随着近年来网络带宽迅速提升和MVC思想的深入人心,JSON越来越多的被用于B/S架构项目的数据交换。JSON不但在诸如EasyUI等流行的前端库中被广泛使用,各后端开发语言也纷纷涌现出对JSON进行操作处理的类库。而在关系数据库领域,对JSON的支持显得稍微落后。虽然主流关系数据库纷纷在其新版本中加入了对JSON数据类型的支持(Oracle 12c、SqlServer 2016、MySql 5.7),但对于很多使用了早期数据库版本的项目和产品,对JSON的处理只能另辟蹊径。
本文将介绍PL/SQL(Oracle的SQL扩展语言)中对JSON处理的开源库PLJSON。虽然本文主要部分成文于2016年,总结了笔者2014年初识PLJSON的经验,看起来并不够“新”,但文中对学习JSON处理库的关键点的提取可供读者在学习任何一种JSON处理库时借鉴。
2 资料下载地址
以下是本文中涉及的各资源、源码的下载地址:
- pljson_V1.04官方资料(含源码):
http://download.youkuaiyun.com/detail/free1985/9811278; - 修改后的pljsonv1.04的printer源码:
http://download.youkuaiyun.com/detail/free1985/9812719 - 本文全部示例代码:
http://download.youkuaiyun.com/detail/free1985/9812807
3 概述
PLJSON是Oracle存储过程中对JSON对象进行操作的开源库,最新版本1.0.6(截至2016年6月29日)。本文中所使用示例均基于版本1.0.4,该版本已在笔者实际项目中运行超过3年,稳定性得到充分验证。作为工具库,PLJSON具有以下特点:
- 基于PL/SQL实现,开源。读者可以根据自己的实际需要通过修改部分源码对该库进行定制;
- http://www.json.org/在PL/SQL语言下唯一推荐的JSON工具库;
- 功能全面,API设计优良。作者将PL/SQL语言提供的各种特性使用得淋漓尽致;
- 项目开发者比较活跃。截止2016年6月29日代码最后提交时间为2016年4月25日;
- 兼容Oracle10g、11g等Oracle主要版本;
4 获取与安装
PLJSON的代码托管于GitHub,项目地址为https://github.com/pljson/pljson。也可以从第二节中的资源链接下载代码。
下载后将得到pljson-master.zip压缩包,解压后将得到如图4-1的文件目录。
图4-1 pljson-master目录树
在PL/SQL Developer中运行install.sql脚本将完成安装,运行uninstall.sql脚本将完成卸载。examples和testsuite文件夹里是一些样例和测试用例,可供参考。
安装过程将会在PL/SQL Developer的命令窗口输出日志。图4-2是安装完全成功输出的日志信息。
图4-2 安装完全成功输出的日志信息
安装成功后,将会创建如图4-3所示的包和类型。
图4-3 PLJSON创建的包和类型
5 库的使用
5.1 基本类型
PLJSON主要包括JSON、JSON_LIST、JSON_VALUE等三种类型。这三种基本类型的用途及与JSON格式的对应关系如表5-1所示。
表5-1 PLJSON基本类型用途及与JSON格式的对应关系
5.2 类型转换
JSON、JSON_LIST、JSON_VALUE间可以进行类型转换。三者间的转换关系及转换函数如图5-1所示。
图5-1 JSON、JSON_LIST、JSON_VALUE的转换关系及转换函数
下面的代码演示了JSON、JSON_LIST、JSON_VALUE三种类型的转换方法。
--类型转换
procedure EG_Convert is
--json对象
aJsonObj json;
--json数组
aJsonArray json_list;
--json值
aJsonValue json_value;
begin
aJsonObj := json('{"key1":"1","key2":"2"}');
--json转json_list
aJsonArray := aJsonObj.get_values;
--输出["1","2"]
aJsonArray.print;
--json转json_value
aJsonValue := aJsonObj.to_json_value;
aJsonArray := json_list('[{"key1":"1","key2":"2"},{"key1":"a","key2":"b"}]');
--json_list转json_value
aJsonValue := aJsonArray.to_json_value;
aJsonValue.print;
--json_value转另两种类型的示例见“对象构造示例”
end;
(未完待续)