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.

Hinweis

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

$binary mit einem der folgenden Werte:

  • eine Zeichenfolge mit Basis-64 Zeichen
  • Ein Objekt mit den Feldern base64 und subType, dessen Werte eine Zeichenfolge mit Basis-64-Zeichen und die Zahl 0 (willkürliche Binärdatei) bzw. 4 (UUID) sind

Wenn es sich bei dem Wert um eine Zeichenfolge mit Basis-64-Zeichen handelt, kann das erweiterte Objekt auch das Feld $subtype mit dem Wert 0 oder 4 aufweisen, das als Ganzzahl (0-255) oder Hexadezimalzeichenfolge mit 2 Zeichen angegeben wird, die eine solche Ganzzahl darstellt.

binär BLOB oder RAW

Zeichenfolge

Die Konvertierung entspricht der Verwendung der SQL-Funktion rawtohex.

Eine der folgenden Optionen:
  • $binary mit Wert und einer Zeichenfolge mit 64 Basiszeichen
  • $rawid mit einem Wert einer Zeichenfolge von 32 Hexadezimalzeichen, wenn die Eingabe einen subType-Wert von 4 (UUID) aufweist
$oid mit einem Wert und einer Zeichenfolge von 24 Hexadezimalzeichen binär RAW(12)

Zeichenfolge

Die Konvertierung entspricht der Verwendung der SQL-Funktion rawtohex.

$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 rawtohex.

$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 rawtohex.

$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

$date mit einem der folgenden Werte:

  • Eine Ganzzahl in Millisekundenanzahl seit dem 1. Januar 1990
  • Eine ISO 8601-Zeitstempelzeichenfolge
  • Ein Objekt mit dem Feld numberLong mit dem Wert einer Ganzzahl in Millisekundenanzahl seit dem 1. Januar 1990
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:

  • Feld $vector mit dem Wert eines Arrays, dessen Elemente Zahlen oder die Zeichenfolgen "Nan", "Inf" und "-Inf" sind (was Nicht-Zahlen- und Unendlichkeitswerte darstellt).

  • Feld $vectorElementType mit Zeichenfolgenwert "float32" oder "float64". Diese entsprechen IEEE-32-Bit- und IEEE-64-Bit-Zahlen.

Vektor VECTOR

Zahlenarray

Zwei Felder:

  • Feld $vector mit dem Wert eines Arrays, dessen Elemente Zahlen oder die Zeichenfolgen "Nan", "Inf" und "-Inf" sind (was Nicht-Zahlen- und Unendlichkeitswerte darstellt).

  • Feld $vectorElementType mit Zeichenfolgenwert "float32" oder "float64".

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.