JSON-Textobjekte, die erweiterte skalare Werte darstellen
Native binäre JSON-Daten (OSON-Format) erweitern die JSON-Sprache, indem skalare Typen hinzugefügt werden, wie Datum, die SQL-Typen entsprechen und nicht Teil des JSON-Standards sind. Oracle Database unterstützt auch die Verwendung von JSON-Textobjekten, die JSON-skalare Werte repräsentieren, einschließlich solcher Nicht-Standardwerte.
Wenn Sie native binäre JSON-Daten aus textuellen JSON-Daten erstellen, die solche erweiterten Objekte enthalten, können diese optional durch entsprechende (native binäre) JSON-skalare Werte ersetzt werden.
Ein Beispiel für ein erweitertes Objekt ist {"$numberDecimal":31}
. Er stellt einen skalaren JSON-Wert des vom Standard abweichenden Typs Dezimalzahl dar. Wird er als solcher interpretiert, wird er durch eine Dezimalzahl im nativen Binärformat ersetzt.
Beispiel: Wenn Sie den JSON-Datentypkonstruktor JSON
verwenden und das Schlüsselwort EXTENDED
verwenden, werden erkannte erweiterte Objekte in der Texteingabe durch entsprechende skalare Werte im nativen JSON-Binärergebnis ersetzt. Wenn Sie das Schlüsselwort EXTENDED
nicht angeben, erfolgt kein solcher Ersatz. Die textuellen erweiterten JSON-Objekte werden einfach unverändert in JSON-Objekte im nativen Binärformat konvertiert.
Wenn Sie die SQL/JSON-Funktion json_serialize
verwenden, um binäre JSON-Daten als Text-JSON-Daten (VARCHAR2
, CLOB
oder BLOB
) zu serialisieren, können Sie das Schlüsselwort EXTENDED
verwenden, um skalare JSON-Werte (native Binärwerte) durch entsprechende erweiterte JSON-Textobjekte zu ersetzen.
Wenn die von Ihnen verwendete Datenbank eine Oracle Autonomous Database ist, können Sie mit der PL/SQL-Prozedur DBMS_CLOUD.copy_collection
eine JSON-Dokumentsammlung aus einer Datei mit JSON-Daten erstellen, wie sie von allgemeinen NoSQL-Datenbanken, einschließlich Oracle NoSQL Database, erstellt wird.
Wenn Sie ejson
als Wert des Parameters type
der Prozedur verwenden, werden erkannte erweiterte JSON-Objekte in der Eingabedatei durch entsprechende skalare Werte in der resultierenden nativen JSON-Binärsammlung ersetzt. In der anderen Richtung können Sie die Funktion json_serialize
mit dem Schlüsselwort EXTENDED
verwenden, um skalare Werte durch erweiterte JSON-Objekte in den resultierenden JSON-Textdaten zu ersetzen.
Dies sind die beiden wichtigsten Anwendungsfälle für erweiterte Objekte:
-
Austausch (Import/Export):
-
Nehmen Sie vorhandene JSON-Daten (von irgendwo) auf, die erweiterte Objekte enthalten.
-
Serialisieren Sie native binäre JSON-Daten als Text-JSON-Daten mit erweiterten Objekten, für eine Verwendung außerhalb der Datenbank.
-
-
Inspektion von nativen binären JSON-Daten: Sehen Sie sich die entsprechenden erweiterten Objekte an.
Zum Austausch können Sie JSON-Daten aus einer Datei aufnehmen, die von allgemeinen NoSQL-Datenbanken, einschließlich Oracle NoSQL Database, erstellt wurde und erweiterte Objekte in native binäre JSON-Skalare konvertiert. In der anderen Richtung können Sie native binäre JSON-Daten als Textdaten exportieren und Oracle-spezifische skalare JSON-Werte durch entsprechende erweiterte JSON-Textobjekte ersetzen.
Tipp:
Als Beispiel für eine Prüfung sollten Sie ein Objekt wie {"dob" : "2000-01-02T00:00:00"}
als Ergebnis der Serialisierung nativer JSON-Daten betrachten. Ist "2000-01-02T00:00:00"
das Ergebnis der Serialisierung eines nativen Binärwerts vom Typ "date" oder ist der native Binärwert nur eine Zeichenfolge? Wenn Sie json_serialize
mit dem Schlüsselwort EXTENDED
verwenden, wissen Sie Bescheid.
Die Zuordnung von erweiterten Objektfeldern zu skalaren JSON-Typen ist im Allgemeinen Eins-zu-Eins: Mehr als eine Art erweitertes JSON-Objekt kann einem bestimmten skalaren Wert zugeordnet werden. Beispiel: Die erweiterten JSON-Objekte {"$numberDecimal":"31"}
und {"$numberLong:"31"}
werden beide als Wert 31 der skalaren Typnummer in JSON-Sprache übersetzt, und die Elementmethode type()
gibt für jeden dieser JSON-Skalare "number"
zurück.
Elementmethode type()
meldet den skalaren Typ der JSON-Sprache des Zielwerts (als JSON-Zeichenfolge). Einige skalare Werte können intern unterschieden werden, selbst wenn sie denselben skalaren Typ aufweisen. Dadurch kann die Funktion json_serialize
(mit Schlüsselwort EXTENDED
) das ursprüngliche erweiterte JSON-Objekt rekonstruieren. Solche skalaren Werte werden intern entweder unterschieden, indem verschiedene SQL-Typen verwendet werden, um sie zu implementieren, oder indem sie mit der Art des erweiterten JSON-Objekts taggen, von dem sie abgeleitet wurden.
Wenn json_serialize
das ursprüngliche erweiterte JSON-Objekt rekonstruiert, ist das Ergebnis nicht immer textuell identisch mit dem Original, es ist jedoch immer semantisch äquivalent. Beispiel: {"$numberDecimal":"31"}
und {"$numberDecimal":31}
sind semantisch äquivalent, obwohl sich die Feldwerte im Typ (Zeichenfolge und Zahl) unterscheiden. Sie werden in denselben internen Wert übersetzt, und jeder wird als abgeleitet von einem erweiterten $numberDecimal
-Objekt (dem gleichen Tag) getaggt. Bei der Serialisierung lautet das Ergebnis für beide jedoch {"$numberDecimal":31}
. Oracle verwendet immer den direkt relevantesten Typ für den Feldwert. In diesem Fall ist dies der JSON-Sprachwert 31
mit der skalaren Typnummer.
In Tabelle 3-1 werden Entsprechungen zwischen den verschiedenen verwendeten Typen angezeigt. Es wird (1) Typen erweiterter Objekte zugeordnet, die als Eingabe verwendet werden, (2) Typen, die von der Elementmethode type()
gemeldet werden, (3) intern verwendete SQL-Typen, (4) standardmäßige JSON-Sprachtypen, die als Ausgabe von Funktion json_serialize
verwendet werden, und (5) Typen erweiterter Objekte, die von json_serialize
ausgegeben werden, wenn Schlüsselwort EXTENDED
angegeben wird.
Tabelle 3-1: Beziehungen für erweiterten JSON-Objekttyp
Erweiterter Objekttyp (Eingabe) | Skalarer Oracle JSON-Typ (gemeldet nach type()) | SQL-Skalart | JSON-Standardskalartyp (Ausgabe) | Erweiterter Objekttyp (Ausgabe) |
---|---|---|---|---|
$numberDouble mit dem Wert einer JSON-Nummer, einer Zeichenfolge, die für die Zahl steht, oder einer der folgenden Zeichenfolgen: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Fußnote 1
|
doppelt | BINARY_DOUBLE |
Zahl |
$numberDouble mit dem Wert einer JSON-Nummer oder einer der folgenden Zeichenfolgen: "Inf" , "-Inf" , "Nan" Fußzeile 2 |
$numberFloat mit demselben Wert wie für $numberDouble |
Gleitkommazahl | BINARY_FLOAT |
Zahl |
$numberFloat mit demselben Wert wie für $numberDouble |
$numberDecimal mit demselben Wert wie für $numberDouble |
Zahl | NUMBER |
Zahl |
$numberDecimal mit demselben Wert wie für $numberDouble |
$numberInt mit dem Wert einer vorzeichenbehafteten 32-Bit-Ganzzahl oder einer Zeichenfolge, die für die Zahl steht
|
Zahl | NUMBER |
Zahl |
$numberInt mit demselben Wert wie für $numberDouble |
$numberLong mit dem Wert einer JSON-Nummer oder einer Zeichenfolge, die für die Zahl steht
|
Zahl | NUMBER |
Zahl |
$numberLong mit demselben Wert wie für $numberDouble |
Wenn es sich bei dem Wert um eine Zeichenfolge mit Basis-64-Zeichen handelt, kann das erweiterte Objekt auch das Feld |
binär | BLOB oder RAW |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
Eine der folgenden Optionen:
|
$oid mit einem Wert und einer Zeichenfolge von 24 Hexadezimalzeichen
|
binär | RAW(12) |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid mit einem Wert und einer Zeichenfolge von 24 Hexadezimalzeichen
|
$rawhex mit Wert einer Zeichenfolge mit einer geraden Anzahl von Hexadezimalzeichen
|
binär | RAW |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$binary mit Wert einer Zeichenfolge mit 64 Basiszeichen, rechts mit = Zeichen aufgefüllt
|
$rawid mit einem Wert aus 24 oder 32 Hexadezimalzeichen
|
binär | RAW |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid |
$oracleDate mit Wert und ISO 8601-Datumszeichenfolge
|
Datum | DATE |
Zeichenfolge |
$oracleDate mit Wert und ISO 8601-Datumszeichenfolge
|
$oracleTimestamp mit Wert und ISO 8601-Zeitstempelzeichenfolge
|
timestamp | TIMESTAMP |
Zeichenfolge |
$oracleTimestamp mit Wert und ISO 8601-Zeitstempelzeichenfolge
|
$oracleTimestampTZ mit dem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonendifferenzwert oder mit Z |
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
Zeichenfolge |
$oracleTimestampTZ mit dem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonendifferenzwert oder mit Z |
|
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
Zeichenfolge |
$oracleTimestampTZ mit dem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einem numerischen Zeitzonendifferenzwert oder mit Z |
$intervalDaySecond mit dem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben |
daysecondInterval | INTERVAL DAY TO SECOND |
Zeichenfolge |
$intervalDaySecond mit dem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben |
$intervalYearMonth mit dem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben |
yearmonthInterval | INTERVAL YEAR TO MONTH |
Zeichenfolge |
$intervalYearMonth mit dem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben |
Zwei Felder:
|
Vektor | VECTOR |
Zahlenarray |
Zwei Felder:
|
Fußnote 1 Die Zeichenfolgenwerte werden ohne Berücksichtigung der Groß-/Kleinschreibung interpretiert. Beispiel: "NAN"
"nan"
und "nAn"
werden akzeptiert und gleichwertig sowie "INF"
, "inFinity"
und "iNf"
. Unendlich große ("Infinity"
oder "Inf"
) und kleine ("-Infinity"
oder "-Inf"
) Zahlen werden entweder mit dem vollständigen Wort oder der Abkürzung akzeptiert.
Fußnote 2 Bei der Ausgabe werden nur diese Zeichenfolgenwerte verwendet – keine Infinity-Varianten mit Vollwort oder Groß-/Kleinschreibung.
Übergeordnetes Thema: JSON in Autonomous Database laden