我有一个JSON文件,如下所示。
"orderingCustomer":{
"@class":"com.worldwide.sector",
"option":"K",
"addressLine1":"DYNAMIC OFFICE, STREET 2",
"addressLine2":null,
"addressLine3":null,
"partyId":null,
"partyName":"DYNAMIC LTD",
"partyBic":null,
"accountNumber":null
}
My Query会解析此JSON,并根据逗号(,)作为分隔符返回行。
SELECT CAST( TRIM( REGEXP_SUBSTR( ( SELECT REPLACE( REGEXP_SUBSTR( DBMS_LOB.SUBSTR( SWIFT_DATA, 32000 ), '["]orderingCustomer["]:{[^}]+' ), '"orderingCustomer":"', '' )
FROM TXN_SWIFT
WHERE ID_TXN_SWIFT = 123 ),
'[^,]+',
1,
3 ) ) AS VARCHAR2( 320 ) )
TRANSTYPE
FROM TXN_SWIFT_OUT_MSG
WHERE MESSAGE_UUID = 12345;
此查询工作正常,并根据分隔符(逗号)为每个关键字提供行方式结果。但是当我搜索“addressLine1”时,我遇到了问题,其结果显示为
"addressLine1":"DYNAMIC OFFICE
而不是
"addressLine1":"DYNAMIC OFFICE, STREET 2"
我尝试将正则表达式更改为显示的正则表达式
[,(?=(?:\[^"\]*"\[^"\]*")*\[^"\]*$)][1]
但即使将正则表达式从[^,]+
替换为,(?=(?:\[^"\]*"\[^"\]*")*\[^"\]*$)
我甚至不再获得价值观。请建议,我的查询可能是什么。 (使用11g版本)
答案 0 :(得分:0)
利用json语法:
"[^"]+":("[^"]+"|null)
基本上,这反映了在json中表示单个属性的语法。支持的类型是字符串并且为null。
在regex101<强> 买者 强>
此正则表达式不处理字符串内的双重引号的情况。以下修改解决了此问题:
"[^:]+?:("([^\\"]+(\\.)*)+"|null|true|false)
基本上,此模式将由双引号分隔的字符串解释为没有\
或"
的字符串序列,这些字符串由转义字符序列分隔。该构造包括没有这样的转义字符的情况。 (附加文字涵盖布尔属性)。
<强> 注意 强>
请注意,不支持数组和对象作为属性值,但由于原始模式显然也不考虑它们,因此这似乎不是您的要求的一部分。 请注意,如果可以的话,正则表达式匹配会很快变得讨厌,因为你必须在模式中提供递归(我甚至不确定oracle的正则表达式引擎是否支持)。