Objetos JSON textuales que representan valores escalares ampliados
Los datos JSON binarios nativos (formato OSSON) amplían el lenguaje JSON agregando tipos escalares, como la fecha, que corresponden a tipos SQL y no forman parte del estándar JSON. Oracle Database también soporta el uso de objetos JSON textuales que representan valores escalares de JSON, incluidos dichos valores no estándar.
Cuando crea datos JSON binarios nativos a partir de datos JSON textuales que contienen dichos objetos ampliados, opcionalmente se pueden sustituir con los valores escalares JSON correspondientes (binarios nativos).
Un ejemplo de un objeto ampliado es {"$numberDecimal":31}
. Representa un valor escalar JSON del tipo no estándar número decimal, y cuando se interpreta como tal, se sustituye por un número decimal en formato binario nativo.
Por ejemplo, al utilizar el constructor de tipo de dato JSON, JSON
, si utiliza la palabra clave EXTENDED
, los objetos extendidos reconocidos en la entrada textual se sustituyen por los valores escalares correspondientes en el resultado JSON binario nativo. Si no incluye la palabra clave EXTENDED
, no se produce dicha sustitución; los objetos JSON extendidos textuales simplemente se convierten tal cual en objetos JSON en el formato binario nativo.
En la dirección opuesta, al utilizar la función SQL/JSON json_serialize
para serializar datos JSON binarios como datos JSON textuales (VARCHAR2
, CLOB
o BLOB
), puede utilizar la palabra clave EXTENDED
para sustituir los valores escalares JSON (binarios nativos) por los objetos JSON ampliados textuales correspondientes.
Si la base de datos que utiliza es una instancia de Oracle Autonomous Database, puede utilizar el procedimiento PL/SQL DBMS_CLOUD.copy_collection
para crear una recopilación de documentos JSON a partir de un archivo de datos JSON como el que producen las bases de datos NoSQL comunes, incluida Oracle NoSQL Database.
Si utiliza ejson
como valor del parámetro type
del procedimiento, los objetos JSON ampliados reconocidos en el archivo de entrada se sustituyen por los valores escalares correspondientes en la recopilación de JSON binaria nativa resultante. En la otra dirección, puede utilizar la función json_serialize
con la palabra clave EXTENDED
para sustituir valores escalares por objetos JSON ampliados en los datos JSON textuales resultantes.
Estos son los dos casos de uso principales para objetos ampliados:
-
Intercambio (importación/exportación):
-
Ingiera datos JSON existentes (desde algún lugar) que contengan objetos extendidos.
-
Serializa los datos JSON binarios nativos como datos JSON textuales con objetos extendidos, para algún uso fuera de la base de datos.
-
-
Inspección de datos JSON binarios nativos: vea lo que tiene mirando los objetos ampliados correspondientes.
Con fines de intercambio, puede ingerir datos JSON de un archivo producido por bases de datos NoSQL comunes, incluida Oracle NoSQL Database, que convierte objetos ampliados en escalares JSON binarios nativos. En la otra dirección, puede exportar datos JSON binarios nativos como datos de texto, sustituyendo los valores JSON escalares específicos de Oracle por los objetos JSON ampliados de texto correspondientes.
Consejo:
Como ejemplo de inspección, considere un objeto como {"dob" : "2000-01-02T00:00:00"}
como resultado de la serialización de datos JSON nativos. ¿Es "2000-01-02T00:00:00"
el resultado de la serialización de un valor binario nativo de tipo fecha, o el valor binario nativo es solo una cadena? El uso de json_serialize
con la palabra clave EXTENDED
le permite saberlo.
La asignación de campos de objeto ampliados a tipos JSON escalares es, en general, de varios a uno: más de un tipo de objeto JSON ampliado se puede asignar a un valor escalar determinado. Por ejemplo, los objetos JSON ampliados {"$numberDecimal":"31"}
y {"$numberLong:"31"}
se traducen como el valor 31 del número de tipo escalar de lenguaje JSON, y el método de elemento type()
devuelve "number"
para cada uno de esos escalares JSON.
El método de elemento type()
informa el tipo escalar de lenguaje JSON de su valor de destino (como una cadena JSON). Algunos valores escalares se distinguen internamente, incluso cuando tienen el mismo tipo escalar. Esto generalmente permite que la función json_serialize
(con la palabra clave EXTENDED
) reconstruya el objeto JSON ampliado original. Estos valores escalares se distinguen internamente mediante diferentes tipos de SQL para implantarlos o etiquetándolos con el tipo de objeto JSON ampliado del que se derivaron.
Cuando json_serialize
reconstruye el objeto JSON ampliado original, el resultado no siempre es textualmente idéntico al original, pero siempre es semánticamente equivalente. Por ejemplo, {"$numberDecimal":"31"}
y {"$numberDecimal":31}
son semánticamente equivalentes, aunque los valores de campo difieran en el tipo (cadena y número). Se traducen al mismo valor interno y cada uno se etiqueta como derivado de un objeto ampliado $numberDecimal
(la misma etiqueta). Sin embargo, al serializar, el resultado para ambos es {"$numberDecimal":31}
. Oracle siempre utiliza el tipo más directamente relevante para el valor de campo, que en este caso es el valor de lenguaje JSON 31
, del número de tipo escalar.
La Tabla 3-1 presenta correspondencias entre los distintos tipos utilizados. Se asigna a través de (1) tipos de objetos extendidos utilizados como entrada, (2) tipos informados por el método de elemento type()
, (3) tipos SQL utilizados internamente, (4) tipos de lenguaje JSON estándar utilizados como salida por la función json_serialize
y (5) tipos de salida de objetos extendidos por json_serialize
cuando se especifica la palabra clave EXTENDED
.
Tabla 3-1 Relaciones de tipo de objeto JSON ampliado
Tipo de objeto ampliado (entrada) | Tipo escalar JSON de Oracle (informado por type()) | Tipo escalar SQL | Tipo escalar JSON estándar (salida) | Tipo de objeto ampliado (salida) |
---|---|---|---|---|
$numberDouble con un valor de número JSON, una cadena que representa el número o una de estas cadenas: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Punto 1
|
doble | BINARY_DOUBLE |
número |
$numberDouble con un valor de número JSON o una de estas cadenas: "Inf" , "-Inf" , "Nan" Punto 2 |
$numberFloat con el mismo valor que para $numberDouble |
flotante | BINARY_FLOAT |
número |
$numberFloat con el mismo valor que para $numberDouble |
$numberDecimal con el mismo valor que para $numberDouble |
número | NUMBER |
número |
$numberDecimal con el mismo valor que para $numberDouble |
$numberInt con un valor entero de 32 bits firmado o una cadena que representa el número
|
número | NUMBER |
número |
$numberInt con el mismo valor que para $numberDouble |
$numberLong con un valor de número JSON o una cadena que represente el número
|
número | NUMBER |
número |
$numberLong con el mismo valor que para $numberDouble |
Cuando el valor es una cadena de 64 caracteres base, el objeto extendido también puede tener el campo |
binario | BLOB o RAW |
cadena La conversión es equivalente al uso de la función SQL |
Una de las siguientes:
|
$oid con un valor de cadena de 24 caracteres hexadecimales
|
binario | RAW(12) |
cadena La conversión es equivalente al uso de la función SQL |
$rawid con un valor de cadena de 24 caracteres hexadecimales
|
$rawhex con un valor de cadena con un número par de caracteres hexadecimales
|
binario | RAW |
cadena La conversión es equivalente al uso de la función SQL |
$binary con el valor una cadena de caracteres base-64, con relleno derecho con caracteres =
|
$rawid con un valor de cadena de 24 o 32 caracteres hexadecimales
|
binario | RAW |
cadena La conversión es equivalente al uso de la función SQL |
$rawid |
$oracleDate con un valor de cadena de fecha ISO 8601
|
fecha | DATE |
cadena |
$oracleDate con un valor de cadena de fecha ISO 8601
|
$oracleTimestamp con un valor de cadena de registro de hora ISO 8601
|
timestamp | TIMESTAMP |
cadena |
$oracleTimestamp con un valor de cadena de registro de hora ISO 8601
|
$oracleTimestampTZ con un valor de cadena de registro de hora ISO 8601 con un desplazamiento de zona horaria numérico o con Z |
registro de hora con zona horaria | TIMESTAMP WITH TIME ZONE |
cadena |
$oracleTimestampTZ con un valor de cadena de registro de hora ISO 8601 con un desplazamiento de zona horaria numérico o con Z |
|
registro de hora con zona horaria | TIMESTAMP WITH TIME ZONE |
cadena |
$oracleTimestampTZ con un valor de cadena de registro de hora ISO 8601 con un desplazamiento de zona horaria numérico o con Z |
$intervalDaySecond con un valor de cadena de intervalo ISO 8601 como se ha especificado para la función SQL to_dsinterval |
daysecondInterval | INTERVAL DAY TO SECOND |
cadena |
$intervalDaySecond con un valor de cadena de intervalo ISO 8601 como se ha especificado para la función SQL to_dsinterval |
$intervalYearMonth con un valor de cadena de intervalo ISO 8601 como se ha especificado para la función SQL to_yminterval |
yearmonthInterval | INTERVAL YEAR TO MONTH |
cadena |
$intervalYearMonth con un valor de cadena de intervalo ISO 8601 como se ha especificado para la función SQL to_yminterval |
Dos campos:
|
vector | VECTOR |
matriz de números |
Dos campos:
|
Nota al pie 1 Los valores de cadena se interpretan de forma no sensible a mayúsculas/minúsculas. Por ejemplo, "NAN"
"nan"
y "nAn"
se aceptan y equivalen, y de manera similar "INF"
, "inFinity"
y "iNf"
. Los números infinitamente grandes ("Infinity"
o "Inf"
) y pequeños ("-Infinity"
o "-Inf"
) se aceptan con la palabra completa o la abreviatura.
Nota al pie 2 En la salida, solo se utilizan estos valores de cadena: no se utilizan variantes de palabra completa Infinity ni mayúsculas/minúsculas.
Consulte también:
Tema principal: Carga de JSON en Autonomous Database