JSON-Textobjekte, die erweiterte skalare Werte darstellen
Der Skriptcontent auf dieser Seite ist ausschließlich für Navigationszwecke vorgesehen und bewirkt keinerlei Änderung des Contents.
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 AI Database unterstützt auch die Verwendung von textuellen JSON-Objekten, 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}. Sie stellt einen skalaren JSON-Wert des vom Standard abweichenden Typs Dezimalzahl dar und wird als solche interpretiert 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 keine solche Ersetzung. 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 JSON-Textdaten (VARCHAR2, CLOB oder BLOB) zu serialisieren, können Sie das Schlüsselwort EXTENDED verwenden, um skalare JSON-Werte (native Binärdaten) durch entsprechende erweiterte JSON-Textobjekte zu ersetzen.
Hinweis: Wenn die von Ihnen verwendete Datenbank eine Oracle Autonomous AI 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 gängigen 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 des Typs "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 durch die Verwendung von verschiedenen SQL-Typen zur Implementierung oder durch Tagging mit der Art des erweiterten JSON-Objekts unterschieden, von dem sie abgeleitet wurden.
Wenn json_serialize das ursprüngliche erweiterte JSON-Objekt rekonstruiert, ist das Ergebnis nicht immer textuell mit dem Original identisch, sondern immer semantisch. 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.
Die folgende Tabelle zeigt die Entsprechungen zwischen den verschiedenen verwendeten Typen. 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.
| 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"(Siehe Fußnote 1 unten) |
doppelt | BINARY_DOUBLE |
Zahl | $numberDouble mit dem Wert einer JSON-Nummer oder einer der folgenden Zeichenfolgen: "Inf", "-Inf", "Nan"(Siehe Fußnote 2 unten) |
$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 aus 24 Hexadezimalzeichen |
binär | RAW(12) |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid mit einem Wert aus 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 und ähnlich "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ßbuchstaben.
Hinweis
Siehe: IEEE-Standard für Gleitkommaarithmetik (IEEE 754)