我在將 XML 內容轉換為 JSON 格式(使用普通的 oracle select 陳述句)時遇到問題,其中原始 XML 中存在超過 1 個子級別的資料 - 在我的代碼中,級別 2 的結果顯示為字串而不是JSON_OBJECT。拜托,有人能告訴我,我的代碼哪里出了問題或者我做錯了什么:
資源:
<envelope>
<sender>
<name>IZS</name>
<country>SU</country>
<address>LOCATION 10B</address>
<address>1000 CITY</address>
<sender_identifier>SU46794093</sender_identifier>
<sender_address>
<sender_agent>SKWWSI20XXX</sender_agent>
<sender_mailbox>SI56031098765414228</sender_mailbox>
</sender_address>
</sender>
</envelope>
轉換選擇陳述句:
WITH SAMPLE AS (SELECT XMLTYPE ('
<envelope>
<sender>
<name>IZS</name>
<country>SU</country>
<address>LOCATION 10B</address>
<address>1000 CITY</address>
<sender_identifier>SU46794093</sender_identifier>
<sender_address>
<sender_agent>SKWWSI20XXX</sender_agent>
<sender_mailbox>SI56031098765414228</sender_mailbox>
</sender_address>
</sender>
</envelope>') XMLDOC FROM DUAL)
SELECT JSON_SERIALIZE (
JSON_OBJECT (
KEY 'envelope' VALUE
JSON_OBJECTAGG (
KEY ID_LEVEL1 VALUE
CASE ID_LEVEL1
WHEN 'sender' THEN
( SELECT JSON_OBJECTAGG (
KEY ID_LEVEL2 VALUE
CASE ID_LEVEL2
WHEN 'sender_address' THEN
( SELECT JSON_OBJECTagg (KEY ID_LEVEL22 VALUE TEXT_LEVEL22)
FROM XMLTABLE ('/sender/sender_address/*'
PASSING XML_LEVEL2
COLUMNS ID_LEVEL22 VARCHAR2 (128) PATH './name()',
TEXT_LEVEL22 VARCHAR2 (128) PATH './text()'
)
)
ELSE
TEXT_LEVEL2
END)
FROM XMLTABLE ('/sender/*'
PASSING XML_LEVEL2
COLUMNS ID_LEVEL2 VARCHAR2 (1024) PATH './name()',
TEXT_LEVEL2 VARCHAR2 (1024) PATH './text()'
)
)
ELSE
'"' || TEXT_LEVEL1 || '"'
END FORMAT JSON)
) PRETTY
)JSON_DOC
FROM SAMPLE, XMLTABLE ('/envelope/*'
PASSING XMLDOC
COLUMNS ID_LEVEL1 VARCHAR2 (1024) PATH './name()',
TEXT_LEVEL1 VARCHAR2 (1024) PATH './text()',
XML_LEVEL2 XMLTYPE PATH '.'
);
錯誤的結果:
{
"envelope" :
{
"sender" :
{
"name" : "IZS",
"country" : "SU",
"address" : "LOCATION 10B",
"address" : "1000 CITY",
"sender_identifier" : "SU46794093",
"sender_address" : "{\"sender_agent\":\"SKWWSI20XXX\",\"sender_mailbox\":\"SI56031098765414228\"}"
}
}
}
錯誤的部分:
***"sender_address" : "{\"sender_agent\":\"SKWWSI20XXX\",\"sender_mailbox\":\"SI56031098765414228\"}"***
uj5u.com熱心網友回復:
對于 1 級文本,您將值用雙引號括起來并指定format json; 你不是在第 2 級這樣做。如果你改變:
ELSE
TEXT_LEVEL2
END
至:
ELSE
'"' || TEXT_LEVEL2 || '"'
END FORMAT JSON)
那么結果是:
{
??"envelope" :
??{
????"sender" :
????{
??????"name" : "IZS",
??????"country" : "SU",
??????"address" : "LOCATION 10B",
??????"address" : "1000 CITY",
??????"sender_identifier" : "SU46794093",
??????"sender_address" :
??????{
????????"sender_agent" : "SKWWSI20XXX",
????????"sender_mailbox" : "SI56031098765414228"
??????}
????}
??}
}
小提琴
uj5u.com熱心網友回復:
問題是您需要在“SELECT JSON_OBJECTAGG(KEY ID_LEVEL2 VALUECASE ID_LEVEL2”中使用條件“FORMAT JSON”:當 ID_LEVEL2 為“sender_address”但不在 ELSE 部分時,但語法要求您放在 CASE 的 END 之后,當然這對于“ELSE TEXT_LEVEL2”部分會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512782.html
上一篇:Clickhouse-copierSAXParseException:第1行第0列中的語法錯誤
下一篇:節點的XML計數為0C#
