Oracle Apex中如何在JSON负载中插入布尔值
解决Oracle Apex中PL/SQL布尔变量拼接JSON的问题
问题原因
- PL/SQL的布尔类型无法直接与字符串拼接,强制拼接会触发
PLS-00306参数数量或类型不匹配错误。 - JSON规范中的布尔值是小写的
true/false(无引号),如果传入带引号的'True'/'False'字符串,会被识别为字符串类型,不符合接口要求。
解决方案
方案1:用CASE语句转换布尔变量为JSON兼容的字符串
将PL/SQL布尔变量通过CASE语句转为小写的'true'或'false'字符串,直接拼入JSON结构中(不需要加引号),生成的JSON中对应字段就是合法的布尔类型。
修改后的代码:
v_json_data := '{ "client_id":"' || :P290_CLIENT_ID || '","secret":"' || :P290_SECRET || '","company_name":"' || :P290_COMPANY_NAME || '","address":{"city":"' || :P290_CITY || '","street":"' || :P290_STREET || '","region":"' || :P290_REGION || '","postal_code":"' || :P290_POSTAL_CODE || '","country_code":"' || :P290_COUNTRY_CODE || '"}, "application_name":"' || :P290_APPLICATION_NAME || '","legal_entity_name":"' || :P290_LEGAL_ENTITIY_NAME || '","website":"' || :P290_WEBSITE || '","is_diligence_attested":' || CASE WHEN v_is_diligence_attested THEN 'true' ELSE 'false' END || ',"is_bank_addendum_completed":' || CASE WHEN v_is_bank_addendum_completed THEN 'true' ELSE 'false' END || ',"products":["auth","transactions"], "technical_contact":{"given_name":"Snoop Dog","family_name":"The OG","email":"SWED@email.com"}, "billing_contact":{"given_name":"Martha","family_name":"Stewart","email":"BBTG@email.com"}, "customer_support_info":{"email":"AADD@email.com","phone_number":"111-111-1111","contact_url":"thisaurl.com","link_update_url":"updateurl.com"}, "assets_under_management":{"amount":100,"iso_currency_code":"USD"}, "registration_number":"100" }';
方案2:使用Oracle原生JSON构造函数(推荐)
避免手动拼接字符串的风险,改用JSON_OBJECT函数构建整个JSON对象,该函数会自动处理PL/SQL布尔类型到JSON布尔类型的转换,同时还能规避SQL注入等问题。
示例代码:
v_json_data := JSON_OBJECT( 'client_id' VALUE :P290_CLIENT_ID, 'secret' VALUE :P290_SECRET, 'company_name' VALUE :P290_COMPANY_NAME, 'address' VALUE JSON_OBJECT( 'city' VALUE :P290_CITY, 'street' VALUE :P290_STREET, 'region' VALUE :P290_REGION, 'postal_code' VALUE :P290_POSTAL_CODE, 'country_code' VALUE :P290_COUNTRY_CODE ), 'application_name' VALUE :P290_APPLICATION_NAME, 'legal_entity_name' VALUE :P290_LEGAL_ENTITIY_NAME, 'website' VALUE :P290_WEBSITE, 'is_diligence_attested' VALUE v_is_diligence_attested, 'is_bank_addendum_completed' VALUE v_is_bank_addendum_completed, 'products' VALUE JSON_ARRAY('auth','transactions'), 'technical_contact' VALUE JSON_OBJECT( 'given_name' VALUE 'Snoop Dog', 'family_name' VALUE 'The OG', 'email' VALUE 'SWED@email.com' ), 'billing_contact' VALUE JSON_OBJECT( 'given_name' VALUE 'Martha', 'family_name' VALUE 'Stewart', 'email' VALUE 'BBTG@email.com' ), 'customer_support_info' VALUE JSON_OBJECT( 'email' VALUE 'AADD@email.com', 'phone_number' VALUE '111-111-1111', 'contact_url' VALUE 'thisaurl.com', 'link_update_url' VALUE 'updateurl.com' ), 'assets_under_management' VALUE JSON_OBJECT( 'amount' VALUE 100, 'iso_currency_code' VALUE 'USD' ), 'registration_number' VALUE '100' ).TO_STRING();
说明
- 方案1适合快速修改现有代码,方案2更规范、安全,推荐在新开发场景中使用。
- 两种方法生成的JSON中,布尔字段都会是
true或false(无引号),完全符合JSON规范和接口要求。
内容的提问来源于stack exchange,提问作者LogicallyFunky
相关产品推荐
相关产品推荐

