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

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

$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 aus 24 Hexadezimalzeichen binär RAW(12)

Zeichenfolge

Die Konvertierung entspricht der Verwendung der SQL-Funktion rawtohex.

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