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.

Hinweis

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

$binary mit einem der folgenden Werte:

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

Wenn der Wert eine Zeichenfolge aus Basis-64-Zeichen ist, kann das erweiterte Objekt auch das Feld $subtype mit dem Wert 0 oder 4 enthalten, das als Ein-Byte-Ganzzahl (0-255) oder als Hexadezimalzeichenfolge mit 2 Zeichen ausgedrückt wird.

binär BLOB oder RAW

Zeichenfolge

Die Konvertierung entspricht der Verwendung der SQL-Funktion rawtohex.

Eine der folgenden Optionen:
  • $binary mit einem Wert einer Zeichenfolge aus Basis-64 Zeichen
  • $rawid mit einer Zeichenfolge aus 32 hexadezimalen Zeichen als Wert für den Wert 4 (UUID) als subType
$oid mit einer Zeichenfolge aus 24 Hexadezimalzeichen als Wert binär RAW(12)

Zeichenfolge

Die Konvertierung entspricht der Verwendung der SQL-Funktion rawtohex.

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

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

$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

$date mit einem der folgenden Werte:

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

  • Feld $vector mit einem Wert für ein Array, dessen Elemente Zahlen oder die Zeichenfolgen "Nan", "Inf" und "-Inf" sind (die Nicht-Zahlen- und unendliche Werte darstellen).

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

Vektor VECTOR

Zahlenarray

Zwei Felder:

  • Feld $vector mit einem Wert für ein Array, dessen Elemente Zahlen oder die Zeichenfolgen "Nan", "Inf" und "-Inf" sind (die Nicht-Zahlen- und unendliche Werte darstellen).

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

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.