Java如何处理Oracle中的JSON数据_使用JSON_OBJECT

夜伟吖_6917

夜伟吖_6917

2026-05-06

653人浏览

原创

Oracle 19c原生JSON字段必须用rs.getObject("col", String.class, SQLType.JSON)读取,且需ojdbc8u3+驱动、AL32UTF8字符集;JSON_OBJECT等表达式返回JSON类型,不可直接映射POJO,须手动解析。

Oracle 19c 中 JSON_OBJECT 生成的 JSON 字段必须用 SQLType.JSON 显式读取

oracle 19c 原生 json 类型字段(如 create table t (j json))在 jdbc 中不会自动转成 string 或 jsonobject,即使你用 rs.getstring("j") 或 rs.getobject("j") 也会抛 sqlexception: invalid column type 或返回乱码。根本原因不是驱动版本低,而是 jdbc 层没注册类型映射。

正确做法是:用带 SQLType 参数的 getObject,且传入 java.sql.SQLType.JSON(注意不是字符串 "JSON"):

String jsonStr = rs.getObject("j", String.class, SQLType.JSON);
  • 必须用 ojdbc8u3+(即 21.9+),旧版驱动不识别 SQLType.JSON
  • rs.getObject("j", String.class) 不带第三个参数 → 报错或返回 null(即使字段非空)
  • 服务端字符集必须为 AL32UTF8,否则中文变成 ???
  • 字段允许为 NULL 时,getObject(..., String.class, SQLType.JSON) 返回 null,不是空字符串

Java 里不能直接把 JSON_OBJECT 结果映射到 POJO(Spring JDBC / MyBatis 默认失效)

JSON_OBJECT('name', e.name, 'dept', d.dname) 这类 SQL 表达式返回的是 Oracle 原生 JSON 类型值,不是字符串。Spring 的 BeanPropertyRowMapper、MyBatis 的默认 resultMap 都不认识它,会跳过该列或报 Cannot convert value of type [oracle.sql.JDBCType] to required type。

必须手动介入解析流程:

  • 用 JdbcTemplate 时,写自定义 RowMapper,先调 rs.getObject("json_col", String.class, SQLType.JSON) 拿字符串,再用 Jackson/Gson 转 POJO
  • MyBatis 中需注册自定义 TypeHandler(如继承 JSONTypeHandler),并在 resultMap 里显式指定 typeHandler="xxx.JSONTypeHandler"
  • 别试图让 JSON_OBJECT 直接生成 Java 对象——Oracle 不负责反序列化,JDBC 更不负责

JSON_EXISTS 和 JSON_VALUE 可以在 SQL 层过滤/提取,但 Java 端仍要按原规则读取

像 WHERE JSON_EXISTS(j, '$.status') 或 SELECT JSON_VALUE(j, '$.user.id') AS uid FROM t 这类写法,只是让 Oracle 在数据库内做计算,返回结果仍是 JSON 类型(前者是 BOOLEAN,后者是 VARCHAR2 或 CLOB)。关键点在于返回列的类型是否还是原生 JSON:

Node.js 可靠编程
Node.js 可靠编程

Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。

下载
  • 如果 SELECT 列是 JSON_OBJECT、JSON_ARRAY 或未加类型转换的 JSON_VALUE(... RETURNING JSON) → 仍需 SQLType.JSON
  • 如果明确写了 JSON_VALUE(j, '$.id' RETURNING VARCHAR2(100)) → 可用 rs.getString() 直接读
  • JSON_QUERY 默认返回 JSON 类型,也得走 SQLType.JSON 流程

别在 PL/SQL 里拼 JSON 字符串来绕过 JDBC 限制

有人试过用 JSON_OBJECT + TO_CHAR 强转成字符串(如 TO_CHAR(JSON_OBJECT(...))),以为能避开类型问题。这看似可行,但有严重隐患:

  • Oracle 默认用数据库字符集编码,若非 AL32UTF8,中文直接损坏
  • JSON_OBJECT 输出含换行缩进(取决于 PRETTY 参数),字符串长度不可控,影响网络传输和解析稳定性
  • 丢失 JSON 类型语义:后续无法用 JSON_EXISTS 等函数再查询该字段
  • 不如老老实实升级驱动、配对 SQLType.JSON,这是 Oracle 官方支持的唯一标准路径

真正容易被忽略的是:SQLType.JSON 必须和 String.class 配合使用,传 Object.class 或 JsonObject.class 会失败——JDBC 层只负责吐出合规 JSON 字符串,解析是上层框架的事。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle java js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11677

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8782

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7532

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1244

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1008

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1496

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3049

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20311

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1335

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程