[FIXED] JSON aus XML erstellen – JSON_AGG-AUSGABEPROBLEM

Ausgabe

Ich habe ein Problem beim Konvertieren von XML-Inhalten in das JSON-Format (mit einfacher Oracle-Select-Anweisung), bei dem mehr als 1 Unterebene von Daten im ursprünglichen XML vorhanden ist – mit meinem Code wird das Ergebnis von Ebene 2+ als Zeichenfolge und nicht als dargestellt JSON_OBJECT. Kann mir bitte jemand sagen, wo der Fehler in meinem Code ist oder was ich falsch mache:

Quelle:

<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>

Transformations-Select-Anweisung:

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 '.'
                                );

falsches Ergebnis:

{
  "envelope" :
  {
    "sender" :
    {
      "name" : "IZS",
      "country" : "SU",
      "address" : "LOCATION 10B",
      "address" : "1000 CITY",
      "sender_identifier" : "SU46794093",
      "sender_address" : "{\"sender_agent\":\"SKWWSI20XXX\",\"sender_mailbox\":\"SI56031098765414228\"}"
    }
  }
}

falscher Teil:

      ***"sender_address" : "{\"sender_agent\":\"SKWWSI20XXX\",\"sender_mailbox\":\"SI56031098765414228\"}"***

Lösung

Für den Text der Ebene 1 setzen Sie den Wert in doppelte Anführungszeichen und geben format json; Sie tun das nicht für Level 2. Wenn Sie sich ändern:

ELSE
  TEXT_LEVEL2
END

zu:

ELSE
  '"' || TEXT_LEVEL2 || '"'
END FORMAT JSON)

dann ist das Ergebnis:

{
  "envelope" :
  {
    "sender" :
    {
      "name" : "IZS",
      "country" : "SU",
      "address" : "LOCATION 10B",
      "address" : "1000 CITY",
      "sender_identifier" : "SU46794093",
      "sender_address" :
      {
        "sender_agent" : "SKWWSI20XXX",
        "sender_mailbox" : "SI56031098765414228"
      }
    }
  }
}

Geige


Beantwortet von –
Alex Poole


Antwort geprüft von –
Dawn Plyler (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like