如何在Crystal Report中读取JSON或XML对象字段
可实现,优先选择数据库层解析方案(稳定性100%,适配所有标准JSON场景)
Crystal Reports 本身没有内置原生JSON解析能力,你之前用ExtractString做字符串截取失效是必然结果——纯字符串匹配无法识别JSON的语法结构,遇到多字段、多数组元素、转义字符时都会出现匹配错误。最稳妥的实现方式是直接在Oracle查询阶段完成JSON解析,把需要的统计值、字段值拆成独立普通字段返回给报表,不需要让Crystal识别JSON类型。
方案1:Oracle 12c及以上版本用原生JSON函数(推荐,适配所有JSON结构)
Oracle 12c之后自带的JSON处理函数完全支持标准JSON的所有结构,不管是多字段、多数组元素还是嵌套结构都能正确解析,示例代码如下:
SELECT raw_json.j, -- 统计JSON数组的元素总数 JSON_TABLE_TBL.array_len AS json_item_count, -- 取数组第1个元素中a字段的值,注意Oracle JSON路径下标从0开始 JSON_VALUE(raw_json.j, '$[0].a' RETURNING NUMBER) AS first_item_a_value FROM ( -- 替换成你实际的业务查询逻辑,下面是测试用例语句 SELECT JSON_ARRAY(JSON_OBJECT('a' VALUE 1)) j FROM DUAL ) raw_json, -- 计算数组长度的关联查询 LATERAL ( SELECT COUNT(*) AS array_len FROM JSON_TABLE(raw_json.j, '$[*]' COLUMNS (item PATH '$')) ) JSON_TABLE_TBL
返回的json_item_count和first_item_a_value都是普通数值类型字段,Crystal Reports会自动识别为对应类型,直接拖拽使用即可,不会出现字符串匹配的bug。
方案2:低版本Oracle兼容的XML转换方案(仅适配无嵌套简单JSON)
如果你使用的Oracle版本低于12c、不支持原生JSON函数,可以先把简单JSON结构转换为XML格式再解析,示例代码:
SELECT raw_json.j, -- 统计数组元素数 XMLTABLE_TBL.array_len AS json_item_count, -- 取数组第1个元素的a字段值 EXTRACTVALUE(xml_converted.converted_xml, '/root/item[1]/a') AS first_item_a_value FROM ( SELECT JSON_ARRAY(JSON_OBJECT('a' VALUE 1, 'b' VALUE 2)) j FROM DUAL ) raw_json, -- 先把JSON数组转成XML结构 LATERAL ( SELECT XMLTYPE( REPLACE(REPLACE(REPLACE(raw_json.j, '[', '<root><item>' ), ']', '</item></root>' ), '},{', '}</item><item>{') ) AS converted_xml ) xml_converted, LATERAL ( SELECT COUNT(*) AS array_len FROM XMLTABLE('/root/item' PASSING xml_converted.converted_xml) ) XMLTABLE_TBL
注意:该方案仅支持无嵌套的单层JSON数组结构,后续如果有嵌套JSON解析需求,还是要升级使用原生JSON函数方案。
不推荐的Crystal Report端处理方案
如果硬要在报表层处理,你需要自行开发自定义用户函数库(UFL)嵌入JSON解析逻辑,开发和维护成本远高于数据库层处理,没有实际使用价值。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

