Oggetti JSON testuali che rappresentano valori scalari estesi
I dati JSON binari nativi (formato OSON) estendono il linguaggio JSON aggiungendo tipi scalari, ad esempio la data, che corrispondono a tipi SQL e non fanno parte dello standard JSON. Oracle Database supporta anche l'uso di oggetti JSON testuali che rappresentano i valori scalari JSON, inclusi tali valori non standard.
Quando crei dati JSON binari nativi da dati JSON testuali che contengono tali oggetti estesi, possono essere facoltativamente sostituiti con i corrispondenti valori scalari JSON (binari nativi).
Un esempio di oggetto esteso è {"$numberDecimal":31}
. Rappresenta un valore scalare JSON del tipo non standard numero decimale e, se interpretato come tale, viene sostituito da un numero decimale in formato binario nativo.
Ad esempio, quando si utilizza il costruttore del tipo di dati JSON, JSON
, se si utilizza la parola chiave EXTENDED
, gli oggetti estesi riconosciuti nell'input testuale vengono sostituiti con i valori scalari corrispondenti nel risultato JSON binario nativo. Se non si include la parola chiave EXTENDED
, la sostituzione non viene eseguita; gli oggetti JSON estesi testuali vengono semplicemente convertiti così com'è in oggetti JSON nel formato binario nativo.
Nella direzione opposta, quando si utilizza la funzione SQL/JSON json_serialize
per serializzare i dati JSON binari come dati JSON testuali (VARCHAR2
, CLOB
o BLOB
), è possibile utilizzare la parola chiave EXTENDED
per sostituire i valori scalari JSON (binario nativo) con i corrispondenti oggetti JSON estesi testuali.
Se il database utilizzato è un Oracle Autonomous Database, è possibile utilizzare la procedura PL/SQL DBMS_CLOUD.copy_collection
per creare una raccolta di documenti JSON da un file di dati JSON, ad esempio quello prodotto dai database NoSQL comuni, incluso Oracle NoSQL Database.
Se si utilizza ejson
come valore del parametro type
della procedura, gli oggetti JSON estesi riconosciuti nel file di input vengono sostituiti con i valori scalari corrispondenti nella raccolta JSON binaria nativa risultante. Nell'altra direzione, è possibile utilizzare la funzione json_serialize
con la parola chiave EXTENDED
per sostituire i valori scalari con oggetti JSON estesi nei dati JSON testuali risultanti.
Questi sono i due casi d'uso principali per gli oggetti estesi:
-
Scambio (importazione/esportazione):
-
Includi dati JSON esistenti (da qualche parte) che contengono oggetti estesi.
-
Serializza i dati JSON binari nativi come dati JSON testuali con oggetti estesi, per alcuni usi al di fuori del database.
-
-
Ispezione dei dati JSON binari nativi: scopri cosa hai guardando gli oggetti estesi corrispondenti.
A scopo di scambio, puoi includere dati JSON da un file prodotto da database NoSQL comuni, incluso Oracle NoSQL Database, convertendo oggetti estesi in scalari JSON binari nativi. Dall'altra parte, puoi esportare i dati JSON binari nativi come dati testuali, sostituendo i valori JSON scalari specifici di Oracle con i corrispondenti oggetti JSON estesi testuali.
Suggerimento
Come esempio di ispezione, considera un oggetto come {"dob" : "2000-01-02T00:00:00"}
come risultato della serializzazione dei dati JSON nativi. "2000-01-02T00:00:00"
è il risultato della serializzazione di un valore binario nativo di tipo data oppure il valore binario nativo è solo una stringa? L'utilizzo di json_serialize
con la parola chiave EXTENDED
consente di sapere.
Il mapping dei campi oggetto estesi ai tipi JSON scalari è, in generale, molti a uno: è possibile mappare più tipi di oggetto JSON esteso a un determinato valore scalare. Ad esempio, gli oggetti JSON estesi {"$numberDecimal":"31"}
e {"$numberLong:"31"}
vengono entrambi tradotti come valore 31 del numero di tipo scalare in lingua JSON e il metodo elemento type()
restituisce "number"
per ciascuno degli scalari JSON.
Il metodo elemento type()
segnala il tipo scalare in lingua JSON del relativo valore di destinazione (come stringa JSON). Alcuni valori scalari sono distinguibili internamente, anche quando hanno lo stesso tipo scalare. In genere, la funzione json_serialize
(con la parola chiave EXTENDED
) consente di ricostruire l'oggetto JSON esteso originale. Tali valori scalari vengono distinti internamente utilizzando tipi SQL diversi per implementarli o taggandoli con il tipo di oggetto JSON esteso da cui sono stati derivati.
Quando json_serialize
ricostruisce l'oggetto JSON esteso originale, il risultato non è sempre textually identico all'originale, ma è sempre equivalente in semantically. Ad esempio, {"$numberDecimal":"31"}
e {"$numberDecimal":31}
sono semanticamente equivalenti, anche se i valori dei campi differiscono per tipo (stringa e numero). Vengono convertiti nello stesso valore interno e ciascuno viene contrassegnato come derivato da un oggetto esteso $numberDecimal
(stessa tag). Tuttavia, se serializzato, il risultato per entrambi è {"$numberDecimal":31}
. Oracle utilizza sempre il tipo più direttamente rilevante per il valore del campo, che in questo caso è il valore in lingua JSON 31
, di tipo scalare.
La Tabella 3-1 presenta le corrispondenze tra i vari tipi utilizzati. Esegue il mapping tra (1) tipi di oggetti estesi utilizzati come input, (2) tipi segnalati dal metodo elemento type()
, (3) tipi SQL utilizzati internamente, (4) tipi di linguaggio JSON standard utilizzati come output dalla funzione json_serialize
e (5) tipi di oggetti estesi restituiti da json_serialize
quando viene specificata la parola chiave EXTENDED
.
Tabella 3-1 Relazioni estese tipo di oggetto JSON
Tipo oggetto esteso (input) | Tipo scalare JSON Oracle (segnalato per type()) | Tipo scalare SQL | Tipo scalare JSON standard (output) | Tipo oggetto esteso (output) |
---|---|---|---|---|
$numberDouble con valore un numero JSON, una stringa che rappresenta il numero o una delle seguenti stringhe: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Foot 1
|
doppio | BINARY_DOUBLE |
numerica |
$numberDouble con valore un numero JSON o una delle seguenti stringhe: "Inf" , "-Inf" , "Nan" Foot 2 |
$numberFloat con valore uguale a quello di $numberDouble |
float | BINARY_FLOAT |
numerica |
$numberFloat con valore uguale a quello di $numberDouble |
$numberDecimal con valore uguale a quello di $numberDouble |
numerica | NUMBER |
numerica |
$numberDecimal con valore uguale a quello di $numberDouble |
$numberInt con un valore intero a 32 bit con segno o una stringa che rappresenta il numero
|
numerica | NUMBER |
numerica |
$numberInt con valore uguale a quello di $numberDouble |
$numberLong con valore un numero JSON o una stringa che rappresenta il numero
|
numerica | NUMBER |
numerica |
$numberLong con valore uguale a quello di $numberDouble |
Quando il valore è una stringa di base-64 caratteri, l'oggetto esteso può anche avere il campo |
binario | BLOB o RAW |
stringa La conversione equivale all'uso della funzione SQL |
Uno dei seguenti:
|
$oid con valore una stringa di 24 caratteri esadecimali
|
binario | RAW(12) |
stringa La conversione equivale all'uso della funzione SQL |
$rawid con valore una stringa di 24 caratteri esadecimali
|
$rawhex con un valore stringa con un numero pari di caratteri esadecimali
|
binario | RAW |
stringa La conversione equivale all'uso della funzione SQL |
$binary con un valore di stringa di base-64 caratteri, con a destra = caratteri
|
$rawid con un valore di stringa di 24 o 32 caratteri esadecimali
|
binario | RAW |
stringa La conversione equivale all'uso della funzione SQL |
$rawid |
$oracleDate con valore stringa di data ISO 8601
|
date | DATE |
stringa |
$oracleDate con valore stringa di data ISO 8601
|
$oracleTimestamp con valore stringa di indicatore orario ISO 8601
|
Indicatore orario | TIMESTAMP |
stringa |
$oracleTimestamp con valore stringa di indicatore orario ISO 8601
|
$oracleTimestampTZ con valore una stringa di indicatore orario ISO 8601 con un offset fuso orario numerico o con Z |
indicatore orario con fuso orario | TIMESTAMP WITH TIME ZONE |
stringa |
$oracleTimestampTZ con valore una stringa di indicatore orario ISO 8601 con un offset fuso orario numerico o con Z |
|
indicatore orario con fuso orario | TIMESTAMP WITH TIME ZONE |
stringa |
$oracleTimestampTZ con valore una stringa di indicatore orario ISO 8601 con un offset fuso orario numerico o con Z |
$intervalDaySecond con valore una stringa di intervallo ISO 8601 come specificato per la funzione SQL to_dsinterval |
daysecondInterval | INTERVAL DAY TO SECOND |
stringa |
$intervalDaySecond con valore una stringa di intervallo ISO 8601 come specificato per la funzione SQL to_dsinterval |
$intervalYearMonth con valore una stringa di intervallo ISO 8601 come specificato per la funzione SQL to_yminterval |
yearmonthInterval | INTERVAL YEAR TO MONTH |
stringa |
$intervalYearMonth con valore una stringa di intervallo ISO 8601 come specificato per la funzione SQL to_yminterval |
Due campi:
|
vettore | VECTOR |
array di numeri |
Due campi:
|
Nota a piè di pagina 1 I valori stringa vengono interpretati senza distinzione tra maiuscole e minuscole. Ad esempio, "NAN"
"nan"
e "nAn"
sono accettati e equivalenti e, analogamente, "INF"
, "inFinity"
e "iNf"
. I numeri infinitamente grandi ("Infinity"
o "Inf"
) e piccoli ("-Infinity"
o "-Inf"
) sono accettati con la parola completa o l'abbreviazione.
Nota a piè di pagina 2 Nell'output vengono utilizzati solo questi valori di stringa. Non vengono utilizzate varianti di Infinity o lettere.
Argomento padre: carica JSON su Autonomous Database