JSON-Textobjekte, die erweiterte skalare Werte darstellen
Native binäre JSON-Daten (OSON-Format) erweitern die JSON-Sprache durch Hinzufügen skalarer Typen, wie Datumsangaben, die SQL-Typen entsprechen und nicht zum JSON-Standard gehören. Oracle Database unterstützt auch die Verwendung von JSON-Textobjekten, die skalare JSON-Werte darstellen, einschließlich solcher benutzerdefinierten Werte.
Wenn Sie native binäre JSON-Daten aus JSON-Textdaten erstellen, die solche erweiterten Objekte enthalten, können sie optional durch entsprechende skalare JSON-Werte (ersetzt) ersetzt werden.
Ein Beispiel für ein erweitertes Objekt ist {"$numberDecimal":31}
. Es stellt einen JSON-Skalarwert des Nicht-Standardtyps Dezimalzahl dar und wird bei der Interpretation als so interpretiert und durch eine Dezimalzahl im nativen Binärformat ersetzt.
Beispiel: Wenn Sie den JSON-Datentypkonstruktor JSON
und das Schlüsselwort EXTENDED
verwenden, werden erkannte erweiterte Objekte in der Texteingabe durch entsprechende skalare Werte im nativen binären JSON-Ergebnis ersetzt. Wenn Sie das Schlüsselwort EXTENDED
nicht aufnehmen, findet keine derartige Ersetzung statt. Die erweiterten JSON-Textobjekte werden einfach unverändert in JSON-Objekte im nativen Binärformat konvertiert.
Wenn Sie umgekehrt die SQL/JSON-Funktion json_serialize
verwenden, um binäre JSON-Daten als JSON-Textdaten zu serialisieren (VARCHAR2
, CLOB
oder BLOB
), können Sie das Schlüsselwort EXTENDED
verwenden, um (native binäre) skalare JSON-Werte durch entsprechende erweiterte JSON-Textobjekte zu ersetzen.
Wenn die von Ihnen verwendete Datenbank eine Oracle Autonomous Database-Instanz ist, können Sie mit der PL/SQL-Prozedur DBMS_CLOUD.copy_collection
eine JSON-Dokument-Collection aus einer Datei mit JSON-Daten erstellen, wie die Daten, die von allgemeinen NoSQL-Datenbanken (einschließlich Oracle NoSQL Database) erstellt wurden.
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 binären JSON-Collection 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.
Im Folgenden sind die beiden wichtigsten Anwendungsfälle für erweiterte Objekte aufgeführt:
-
Austausch (Import/Export):
-
Aufnahme vorhandener JSON-Daten (egal von wo), die erweiterte Objekte enthalten.
-
Serialisierung nativer Binär-JSON-Daten als JSON-Textdaten mit erweiterten Objekten zur Verwendung außerhalb der Datenbank.
-
-
Inspektion von nativen binären JSON-Daten: Prüfen Sie den Datenbestand, indem Sie die entsprechenden erweiterten Objekte anzeigen.
Zu Exchange-Zwecken können Sie JSON-Daten aus einer Datei aufnehmen, die von allgemeinen NoSQL-Datenbanken erzeugt wird, einschließlich Oracle NoSQL Database. Dabei werden 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 dabei Oracle-spezifische skalare JSON-Werte mit entsprechenden erweiterten JSON-Textobjekten ersetzen.
Tipp:
Beispiel für eine Prüfung: Betrachten wir ein Objekt wie {"dob" : "2000-01-02T00:00:00"}
als Ergebnis der Serialisierung nativer JSON-Daten. 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? Dies erfahren Sie, wenn Sie json_serialize
mit dem Schlüsselwort EXTENDED
verwenden.
Die Zuordnung von Feldern für erweiterte Objekte zu skalaren JSON-Typen ist im Allgemeinen "Viel zu Eins": Mehrere Arten von erweiterten JSON-Objekten können einem bestimmten skalaren Wert zugeordnet werden. Beispiel: Die erweiterten JSON-Objekte {"$numberDecimal":"31"}
und {"$numberLong:"31"}
werden beide als Wert 31 des skalaren Typs number in JSON-Sprache übersetzt, und die Elementmethode type()
gibt "number"
für jedes dieser JSON-Skalare zurück.
Die Elementmethode type()
meldet den skalaren Typ der JSON-Sprache für den Zielwert (als JSON-Zeichenfolge). Einige skalare Werte sind intern unterscheidbar, selbst wenn sie denselben skalaren Typ aufweisen. Dadurch kann die Funktion json_serialize
(mit dem Schlüsselwort EXTENDED
) das ursprüngliche erweiterte JSON-Objekt in der Regel neu erstellen. Solche skalaren Werte werden intern entweder durch Verwendung von verschiedenen SQL-Typen bei ihrer Implementierung oder durch Tagging mit dem Typ 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, jedoch immer semantisch äquivalent. Beispiel: {"$numberDecimal":"31"}
und {"$numberDecimal":31}
sind semantisch gleichwertig, auch wenn sich der Typ der Feldwerte (Zeichenfolge und Zahl) unterscheidet. Sie werden in denselben internen Wert übersetzt, wobei jeder Wert als von einem erweiterten $numberDecimal
-Objekt abgeleitet getaggt wird (gleicher Tag). Wenn sie jedoch serialisiert werden, lautet das Ergebnis für beide {"$numberDecimal":31}
. Oracle verwendet immer den unmittelbar relevanten Typ für den Feldwert (in diesem Fall den JSON-Sprachwert 31
) des skalaren Typs "number".
In Tabelle 3-1 werden Übereinstimmungen zwischen den verschiedenen verwendeten Typen angezeigt. Es wird über (1) als Eingabe verwendete erweiterte Objekttypen, (2) von der Elementmethode type()
gemeldete Typen, (3) intern verwendete SQL-Typen, (4) JSON-Standardsprachentypen, die als Ausgabe der Funktion json_serialize
verwendet werden, und (5) von json_serialize
ausgegebene erweiterte Objekttypen zugeordnet, wenn das Schlüsselwort EXTENDED
angegeben wird.
Tabelle 3-1 Beziehungen zwischen erweiterten JSON-Objekttypen
Erweiterter Objekttyp (Eingabe) | Skalärer Oracle JSON-Typ (gemeldet von type()) | Skalarer SQL-Typ | Skalarer JSON-Standardtyp (Output) | Erweiterter Objekttyp (Ausgabe) |
---|---|---|---|---|
$numberDouble mit einer JSON-Zahl, einer Zeichenfolge für die Zahl oder einer der folgenden Zeichenfolgen als Wert: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" 1.Fußnote
|
Double | BINARY_DOUBLE |
Zahl |
$numberDouble mit einer JSON-Nummer oder einer der folgenden Zeichenfolgen als Wert: "Inf" , "-Inf" , "Nan" Fußnote 2 |
$numberFloat mit demselben Wert wie für $numberDouble |
float | 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 einer signierten 32-Bit- Ganzzahl oder einer Zeichenfolge für die Zahl als Wert
|
Zahl | NUMBER |
Zahl |
$numberInt mit demselben Wert wie für $numberDouble |
$numberLong mit einem 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 der Wert eine Zeichenfolge aus Basis-64-Zeichen ist, 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 einer Zeichenfolge aus 24 Hexadezimalzeichen als Wert
|
binär | RAW(12) |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid mit einer Zeichenfolge aus 24 Hexadezimalzeichen als Wert
|
$rawhex mit einer Zeichenfolge mit einer geraden Anzahl von hexadezimalen Zeichen als Wert
|
binär | RAW |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$binary mit einem Wert einer Zeichenfolge aus Basis-64 Zeichen, rechts aufgefüllt mit = Zeichen
|
$rawid mit einer Zeichenfolge aus 24 oder 32 hexadezimalen Zeichen als Wert
|
binär | RAW |
Zeichenfolge Die Konvertierung entspricht der Verwendung der SQL-Funktion |
$rawid |
$oracleDate mit einem Wert einer ISO 8601-Datumszeichenfolge
|
am | DATE |
Zeichenfolge |
$oracleDate mit einem Wert einer ISO 8601-Datumszeichenfolge
|
$oracleTimestamp mit einem Wert einer ISO 8601-Zeitstempelzeichenfolge
|
timestamp | TIMESTAMP |
Zeichenfolge |
$oracleTimestamp mit einem Wert einer ISO 8601-Zeitstempelzeichenfolge
|
$oracleTimestampTZ mit einem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einer numerischen Zeitzonendifferenz oder mit Z |
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
Zeichenfolge |
$oracleTimestampTZ mit einem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einer numerischen Zeitzonendifferenz oder mit Z |
|
Zeitstempel mit Zeitzone | TIMESTAMP WITH TIME ZONE |
Zeichenfolge |
$oracleTimestampTZ mit einem Wert einer ISO 8601-Zeitstempelzeichenfolge mit einer numerischen Zeitzonendifferenz oder mit Z |
$intervalDaySecond mit einem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben |
daysecondInterval | INTERVAL DAY TO SECOND |
Zeichenfolge |
$intervalDaySecond mit einem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_dsinterval angegeben |
$intervalYearMonth mit einem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben |
yearmonthInterval | INTERVAL YEAR TO MONTH |
Zeichenfolge |
$intervalYearMonth mit einem Wert einer ISO 8601-Intervallzeichenfolge, wie für die SQL-Funktion to_yminterval angegeben |
Zwei Felder:
|
Vektor | VECTOR |
Zahlenarray |
Zwei Felder:
|
Footnote 1 Die Zeichenfolgenwerte werden ohne Berücksichtigung der Groß- und Kleinschreibung interpretiert. Beispiel: "NAN"
"nan"
und "nAn"
werden akzeptiert und sind gleichwertig, ähnlich wie die Werte "INF"
, "inFinity"
und "iNf"
. Unbegrenzt große Zahlen ("Infinity"
oder "Inf"
) und kleine Zahlen ("-Infinity"
oder "-Inf"
) werden mit dem vollständigen Wort oder der Abkürzung akzeptiert.
Footnote 2 Bei der Ausgabe werden nur diese Zeichenfolgewerte verwendet - vollständige Wörter (Infinity) oder Varianten in Groß- und Kleinschreibung werden nicht verwendet.
Übergeordnetes Thema: JSON in Autonomous Database laden