Objetos JSON Textuais que Representam Valores Escalares Estendidos
Os dados JSON binários nativos (formato OSON) estendem a linguagem JSON adicionando tipos escalares, como data, que correspondem a tipos SQL e não fazem parte do padrão JSON. O Oracle Database também suporta o uso de objetos JSON textuais que representam valores escalares JSON, incluindo esses valores não padrão.
Quando você cria dados JSON binários nativos com base em dados JSON textuais que contêm esses objetos estendidos, eles podem, opcionalmente, ser substituídos por valores escalares JSON correspondentes (binários nativos).
Um exemplo de objeto estendido é {"$numberDecimal":31}
. Representa um valor escalar JSON do tipo não padrão número decimal e, quando interpretado como tal, é substituído por um número decimal no formato binário nativo.
Por exemplo, quando você usa o construtor de tipo de dados JSON, JSON
, se você usar a palavra-chave EXTENDED
, os objetos estendidos reconhecidos na entrada textual serão substituídos pelos valores escalares correspondentes no resultado JSON binário nativo. Se você não incluir a palavra-chave EXTENDED
, essa substituição não ocorrerá; os objetos JSON estendidos textuais serão simplesmente convertidos no estado em que se encontram em objetos JSON no formato binário nativo.
Na direção oposta, quando você usa a função SQL/JSON json_serialize
para serializar dados JSON binários como dados JSON textuais (VARCHAR2
, CLOB
ou BLOB
), pode usar a palavra-chave EXTENDED
para substituir valores escalares JSON (binários nativos) por objetos JSON textuais estendidos correspondentes.
Se o banco de dados usado for um Oracle Autonomous Database, você poderá usar o procedimento PL/SQL DBMS_CLOUD.copy_collection
para criar uma coleção de documentos JSON com base em um arquivo de dados JSON, como o produzido por bancos de dados NoSQL comuns, incluindo o Oracle NoSQL Database.
Se você usar ejson
como o valor do parâmetro type
do procedimento, os objetos JSON estendidos reconhecidos no arquivo de entrada serão substituídos pelos valores escalares correspondentes na coleção JSON binária nativa resultante. Na outra direção, você pode usar a função json_serialize
com a palavra-chave EXTENDED
para substituir valores escalares por objetos JSON estendidos nos dados JSON textuais resultantes.
Estes são os dois principais casos de uso para objetos estendidos:
-
Troca (importação/exportação):
-
Ingerir dados JSON existentes (de algum lugar) que contenham objetos estendidos.
-
Serialize dados JSON binários nativos como dados JSON textuais com objetos estendidos, para algum uso fora do banco de dados.
-
-
Inspeção de dados JSON binários nativos: veja o que você tem observando os objetos estendidos correspondentes.
Para fins de troca, você pode ingerir dados JSON de um arquivo produzido por bancos de dados NoSQL comuns, incluindo o Oracle NoSQL Database, convertendo objetos estendidos em escalares JSON binários nativos. Na outra direção, você pode exportar dados JSON binários nativos como dados textuais, substituindo valores JSON escalares específicos da Oracle por objetos JSON estendidos textuais correspondentes.
Dica:
Como exemplo de inspeção, considere um objeto como {"dob" : "2000-01-02T00:00:00"}
como resultado da serialização de dados JSON nativos. "2000-01-02T00:00:00"
é o resultado da serialização de um valor binário nativo do tipo data ou o valor binário nativo é apenas uma string? Usar json_serialize
com a palavra-chave EXTENDED
permite que você saiba.
O mapeamento de campos de objeto estendido para tipos JSON escalares é, em geral, muitos para um: mais de um tipo de objeto JSON estendido pode ser mapeado para um determinado valor escalar. Por exemplo, os objetos JSON estendidos {"$numberDecimal":"31"}
e {"$numberLong:"31"}
são traduzidos como o valor 31 do número do tipo escalar de idioma JSON, e o método de item type()
retorna "number"
para cada um desses escalares JSON.
O método de item type()
reporta o tipo escalar de idioma JSON de seu valor de destino (como uma string JSON). Alguns valores escalares são distinguíveis internamente, mesmo quando têm o mesmo tipo escalar. Isso geralmente permite que a função json_serialize
(com a palavra-chave EXTENDED
) reconstrua o objeto JSON estendido original. Tais valores escalares são diferenciados internamente usando diferentes tipos de SQL para implementá-los ou marcando-os com o tipo de objeto JSON estendido do qual foram derivados.
Quando o json_serialize
reconstrói o objeto JSON estendido original, o resultado nem sempre é textualmente idêntico ao original, mas é sempre semanticamente equivalente. Por exemplo, {"$numberDecimal":"31"}
e {"$numberDecimal":31}
são semanticamente equivalentes, mesmo que os valores do campo sejam diferentes no tipo (string e número). Eles são traduzidos para o mesmo valor interno e cada um é marcado como derivado de um objeto estendido $numberDecimal
(mesma tag). Mas quando serializado, o resultado para ambos é {"$numberDecimal":31}
. A Oracle sempre usa o tipo mais diretamente relevante para o valor de campo, que nesse caso é o valor de idioma JSON 31
, do número de tipo escalar.
A Tabela 3-1 apresenta correspondências entre os vários tipos usados. Ele mapeia entre (1) tipos de objetos estendidos usados como entrada, (2) tipos reportados pelo método de item type()
, (3) tipos de SQL usados internamente, (4) tipos de linguagem JSON padrão usados como saída pela função json_serialize
e (5) tipos de saída de objetos estendidos por json_serialize
quando a palavra-chave EXTENDED
é especificada.
Tabela 3-1 Relações de Tipo de Objeto JSON Estendido
Tipo de Objeto Estendido (Entrada) | Tipo Escalar JSON do Oracle (Reportado por type()) | Tipo Escalar SQL | Tipo Escalar JSON Padrão (Saída) | Tipo de Objeto Estendido (Saída) |
---|---|---|---|---|
$numberDouble com valor JSON, uma string que representa o número ou uma destas strings: "Infinity" , "-Infinity" , "Inf" , "-Inf" , "Nan" Rodapé 1
|
duplo | BINARY_DOUBLE |
número |
$numberDouble com um valor JSON ou uma destas strings: "Inf" , "-Inf" , "Nan" Rodapé 2 |
$numberFloat com valor igual a $numberDouble |
flutuante | BINARY_FLOAT |
número |
$numberFloat com valor igual a $numberDouble |
$numberDecimal com valor igual a $numberDouble |
número | NUMBER |
número |
$numberDecimal com valor igual ao de $numberDouble |
$numberInt com um valor inteiro de 32 bits assinado ou uma string que representa o número
|
número | NUMBER |
número |
$numberInt com valor igual a $numberDouble |
$numberLong com um valor JSON ou uma string que representa o número
|
número | NUMBER |
número |
$numberLong com valor igual ao de $numberDouble |
Quando o valor é uma string de caracteres base-64, o objeto estendido também pode ter o campo |
binário | BLOB ou RAW |
string A conversão é equivalente ao uso da função SQL |
Uma das seguintes opções se aplica:
|
$oid com valor de uma string de 24 caracteres hexadecimais
|
binário | RAW(12) |
string A conversão é equivalente ao uso da função SQL |
$rawid com valor de uma string de 24 caracteres hexadecimais
|
$rawhex com valor de uma string com um número par de caracteres hexadecimais
|
binário | RAW |
string A conversão é equivalente ao uso da função SQL |
$binary com valor de uma string de 64 caracteres base, preenchida à direita com = caracteres
|
$rawid com valor de uma string de 24 ou 32 caracteres hexadecimais
|
binário | RAW |
string A conversão é equivalente ao uso da função SQL |
$rawid |
$oracleDate com valor e uma string de data ISO 8601
|
data | DATE |
string |
$oracleDate com valor e uma string de data ISO 8601
|
$oracleTimestamp com valor e string de timestamp ISO 8601
|
timestamp | TIMESTAMP |
string |
$oracleTimestamp com valor e string de timestamp ISO 8601
|
$oracleTimestampTZ com valor uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
timestamp com fuso horário | TIMESTAMP WITH TIME ZONE |
string |
$oracleTimestampTZ com valor uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
|
timestamp com fuso horário | TIMESTAMP WITH TIME ZONE |
string |
$oracleTimestampTZ com valor uma string de timestamp ISO 8601 com um deslocamento de fuso horário numérico ou com Z |
$intervalDaySecond com valor e uma string de intervalo ISO 8601 conforme especificado para a função SQL to_dsinterval |
daysecondInterval | INTERVAL DAY TO SECOND |
string |
$intervalDaySecond com valor e uma string de intervalo ISO 8601 conforme especificado para a função SQL to_dsinterval |
$intervalYearMonth com valor e uma string de intervalo ISO 8601 conforme especificado para a função SQL to_yminterval |
yearmonthInterval | INTERVAL YEAR TO MONTH |
string |
$intervalYearMonth com valor e uma string de intervalo ISO 8601 conforme especificado para a função SQL to_yminterval |
Dois campos:
|
vetor | VECTOR |
matriz de números |
Dois campos:
|
Rodapé 1 Os valores das strings são interpretados sem distinção entre maiúsculas e minúsculas. Por exemplo, "NAN"
"nan"
e "nAn"
são aceitos e equivalentes e, da mesma forma, "INF"
, "inFinity"
e "iNf"
. Números infinitamente grandes ("Infinity"
ou "Inf"
) e pequenos ("-Infinity"
ou "-Inf"
) são aceitos com a palavra completa ou a abreviação.
Nota de Rodapé 2 Na saída, somente esses valores de string são usados — nenhuma variante de palavra completa Infinity ou letra maiúscula.
Consulte Também:
Tópico principal: Carregar JSON no Autonomous Database