Objetos JSON textuales que representan valores escalares ampliados

Los datos JSON binarios nativos ( formato OSON) amplían el lenguaje JSON agregando tipos escalares, como fecha, que se corresponden con tipos SQL y no forman parte del estándar JSON. Oracle Database also supports the use of textual JSON objects that represent JSON scalar values, including such nonstandard values.

Al crear datos JSON binarios nativos a partir de datos JSON textuales que contienen dichos objetos ampliados, se pueden sustituir opcionalmente con los valores escalares JSON correspondientes (binarios nativos).

Un ejemplo de 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 datos JSON, JSON, si utiliza la palabra clave EXTENDED, los objetos ampliados reconocidos en la entrada de texto se sustituyen por los valores escalares correspondientes en el resultado JSON nativo. Si no incluye la palabra clave EXTENDED, no se produce dicha sustitución; los objetos JSON ampliados 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 de Oracle json_serialize para serializar datos JSON binarios como datos JSON textuales (VARCHAR2, CLOB o BLOB), puede utilizar la palabra clave EXTENDED para sustituir (binario nativo) los valores escalares JSON por los correspondientes objetos JSON textuales ampliados.

Nota

Si la base de datos que utiliza es 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 producido por 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 JSON binaria nativa resultante. En la otra dirección, puede utilizar la función json_serialize con la palabra clave EXTENDED para sustituir los valores escalares por objetos JSON ampliados en los datos JSON textuales resultantes.

Estos son los dos casos de uso principales para objetos ampliados:

  • Exchange (importación y exportación):

    • Ingesta de datos JSON existentes (desde algún lugar) que contengan objetos ampliados.

    • Serialización de datos JSON binarios nativos como datos JSON textuales con objetos ampliados, para algunos usos fuera de la base de datos.

  • Inspección de datos JSON binarios nativos: vea lo que tiene mirando los objetos ampliados correspondientes.

Para el intercambio, puede realizar la ingesta de datos JSON de un archivo producido por bases de datos NoSQL comunes, incluida Oracle NoSQL Database, mediante la conversión de objetos ampliados en escalares JSON binarios nativos. En la otra dirección, puede exportar datos JSON binarios nativos como datos textuales, sustituyendo los valores JSON escalares específicos de Oracle por los objetos JSON ampliados textuales correspondientes.

Como ejemplo de inspección, considere un objeto como {"dob" : "2000-01-02T00:00:00"} como resultado de la seriación de datos JSON nativos. ¿Es "2000-01-02T00:00:00" el resultado de serializar un valor binario nativo de tipo fecha o es el valor binario nativo solo una cadena? El uso de json_serialize con la palabra clave EXTENDED le permite saberlo.

La asignación de campos de objetos ampliados a tipos JSON escalares es, en general, varios a uno: se puede asignar más de un tipo de objeto JSON ampliado a un valor escalar determinado. Por ejemplo, los objetos JSON ampliados {"$numberDecimal":"31"} y {"$numberLong:"31"} se convierten 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 del tipo escalar de idioma JSON de su valor objetivo (como cadena JSON). Algunos valores escalares se pueden distinguir internamente, incluso cuando tienen el mismo tipo escalar. Esto generalmente permite que la función json_serialize (con la palabra clave EXTENDED) pueda reconstruir el objeto JSON ampliado original. Estos valores escalares se distinguen internamente, ya sea mediante el uso de diferentes tipos 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 emanalmente equivalente. Por ejemplo, {"$numberDecimal":"31"} y {"$numberDecimal":31} son semánticamente equivalentes, aunque los valores de campo difieran en tipo (cadena y número). Se convierten al mismo valor interno y cada uno se etiqueta como derivado de un objeto ampliado (misma etiqueta) $numberDecimal. Sin embargo, cuando se serializa, 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.

Nota

Hay dos casos en los que el tipo de objeto ampliado original se puede perder al derivar el valor binario-JSON interno.

  • Un objeto ampliado con el campo $numberInt se convierte en un valor interno NUMBER de Oracle SQL, sin etiqueta. La serialización de ese valor produce un valor JSON-language estándar de tipo número. No hay pérdida en el valor numérico; la única pérdida es la información de que los datos textuales originales eran un objeto ampliado $numberInt.

  • El uso del campo $numberDecimal con valores infinitos, muy pequeños, muy grandes o sin número-a-número no está soportado y da lugar a un comportamiento indefinido. No utilice un valor de cadena que represente infinito positivo ("Infinity" o "Inf"), infinito negativo ("-Infinity" o "-Inf") o un valor desconocido (no un número, "Nan") con $numberDecimal; en su lugar, utilice $numberDouble con dichos valores.

En la Tabla 3-1 se presentan las correspondencias entre los distintos tipos utilizados. Asigna entre (1) tipos de objetos ampliados 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 ampliados 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 de Oracle JSON (notificado por type()) Tipo escalar SQL Tipo escalable JSON estándar (saliente) Tipo de objeto ampliado (salida)
$numberDouble con un valor de número JSON, cadena que representa el número o una de estas cadenas: "Infinity", "-Infinity", "Inf", "-Inf", "Nan"Nota del usuario: 1 doble BINARY_DOUBLE

número

$numberDouble con un valor de número JSON o una de estas cadenas: "Inf", "-Inf", "Nan"Nota al pie 2
$numberFloat con el mismo valor que para $numberDouble float 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 de entero firmado de 32 bits 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 representa el número número NUMBER

número

$numberLong con el mismo valor que para $numberDouble

$binary con uno de estos valores:

  • una cadena de caracteres en base 64
  • Un objeto con los campos base64 y subType, cuyos valores son una cadena de caracteres en base a 64 y el número 0 (binario arbitrario) o 4 (UUID), respectivamente

Cuando el valor es una cadena de caracteres base 64, el objeto ampliado también puede tener el campo $subtype con el valor 0 o 4, expresado como un entero de un byte (0-255) o una cadena hexadecimal de 2 caracteres que representa dicho entero.

binarios BLOB o RAW

Cadena

La conversión es equivalente al uso de la función SQL rawtohex.

Una de las siguientes:
  • $binary con un valor de cadena de caracteres en base 64
  • $rawid con un valor de cadena de 32 caracteres hexadecimales, si la entrada tiene un valor subType 4 (UUID)
$oid con un valor de cadena de 24 caracteres binarios RAW(12)

Cadena

La conversión es equivalente al uso de la función SQL rawtohex.

$rawid con un valor de cadena de 24 caracteres
$rawhex con un valor de cadena con un número par de caracteres hexadecimales binarios RAW

Cadena

La conversión es equivalente al uso de la función SQL rawtohex.

$binary con un valor de cadena de caracteres en base 64, relleno a la derecha con caracteres =
$rawid con un valor de cadena de 24 o 32 caracteres hexadecimal binarios RAW

Cadena

La conversión es equivalente al uso de la función SQL rawtohex.

$rawid
$oracleDate con valor de una cadena de fecha ISO 8601 fecha DATE

Cadena

$oracleDate con valor de una cadena de fecha ISO 8601
$oracleTimestamp con valor de una cadena de registro de hora ISO 8601 timestamp TIMESTAMP

Cadena

$oracleTimestamp con valor de una cadena de registro de hora ISO 8601
$oracleTimestampTZ con un valor de una cadena de registro de hora ISO 8601 con un desfase numérico de zona horaria o con Z registro de hora con zona horaria TIMESTAMP WITH TIME ZONE

Cadena

$oracleTimestampTZ con un valor de una cadena de registro de hora ISO 8601 con un desfase numérico de zona horaria o con Z

$date con el valor uno de los siguientes elementos:

  • Recuento entero de milisegundos desde el 1 de enero de 1990
  • Cadena de registro de hora ISO 8601
  • Un objeto con el campo numberLong con un valor de recuento entero en segundos desde el 1 de enero de 1990
registro de hora con zona horaria TIMESTAMP WITH TIME ZONE

Cadena

$oracleTimestampTZ con un valor de una cadena de registro de hora ISO 8601 con un desfase numérico de zona horaria o con Z
$intervalDaySecond con valor de una cadena de intervalo ISO ISO 8601 como se especifica para la función SQL to_dsinterval daysecondInterval INTERVAL DAY TO SECOND

Cadena

$intervalDaySecond con valor de una cadena de intervalo ISO ISO 8601 como se especifica para la función SQL to_dsinterval
$intervalYearMonth con valor de una cadena de intervalo ISO ISO 8601 como se especifica para la función SQL to_yminterval yearmonthInterval INTERVAL YEAR TO MONTH

Cadena

$intervalYearMonth con valor de una cadena de intervalo ISO ISO 8601 como se especifica para la función SQL to_yminterval

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 son equivalentes, así como "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: ningún valor Infinity de palabra completa ni variantes de mayúsculas/minúsculas.