Objets JSON textuels représentant des valeurs scalaires étendues

Les données JSON binaires natives (format OSON) étendent le langage JSON en ajoutant des types scalaires, tels que la date, qui correspondent aux types SQL et ne font pas partie de la norme JSON. Oracle Database prend également en charge l'utilisation d'objets JSON textuels qui représentent des valeurs scalaires JSON, y compris de telles valeurs non standard.

Lorsque vous créez des données JSON binaires natives à partir de données JSON textuelles contenant de tels objets étendus, elles peuvent éventuellement être remplacées avec les valeurs scalaires JSON (binaires natives) correspondantes.

{"$numberDecimal":31} est un exemple d'objet étendu. Il représente une valeur scalaire JSON de type non standard nombre décimal, et lorsqu'elle est interprétée comme telle, elle est remplacée par un nombre décimal au format binaire natif.

Par exemple, lorsque vous utilisez le constructeur de type de données JSON, JSON, si vous utilisez le mot-clé EXTENDED, les objets étendus reconnus dans l'entrée textuelle sont remplacés par les valeurs scalaires correspondantes dans le résultat JSON binaire natif. Si vous n'incluez pas le mot-clé EXTENDED, aucun remplacement de ce type n'est effectué. Les objets JSON étendus textuels sont simplement convertis tels quels en objets JSON au format binaire natif.

Dans la direction opposée, lorsque vous utilisez la fonction SQL/JSON json_serialize pour sérialiser les données JSON binaires en tant que données JSON textuelles (VARCHAR2, CLOB ou BLOB), vous pouvez utiliser le mot-clé EXTENDED pour remplacer les valeurs scalaires JSON (binaires natifs) par les objets JSON étendus textuels correspondants.

Remarque

Si la base de données que vous utilisez est une base de données Oracle Autonomous Database, vous pouvez utiliser la procédure PL/SQL DBMS_CLOUD.copy_collection pour créer une collection de documents JSON à partir d'un fichier de données JSON telles que celles produites par les bases de données NoSQL communes, y compris Oracle NoSQL Database.

Si vous utilisez ejson comme valeur du paramètre type de la procédure, les objets JSON étendus reconnus dans le fichier d'entrée sont remplacés par les valeurs scalaires correspondantes dans la collection JSON binaire native obtenue. Dans l'autre sens, vous pouvez utiliser la fonction json_serialize avec le mot-clé EXTENDED pour remplacer les valeurs scalaires par des objets JSON étendus dans les données JSON textuelles résultantes.

Voici les deux principaux cas d'utilisation des objets étendus :

  • Echange (import/export) :

    • Assimilez les données JSON existantes (de quelque part) qui contiennent des objets étendus.

    • Sérialisez les données JSON binaires natives en tant que données JSON textuelles avec des objets étendus, pour certaines utilisations en dehors de la base de données.

  • Inspection des données JSON binaires natives : voyez ce que vous avez en examinant les objets étendus correspondants.

A des fins d'échange, vous pouvez ingérer des données JSON à partir d'un fichier produit par des bases de données NoSQL communes, y compris Oracle NoSQL Database, en convertissant des objets étendus en scalaires JSON binaires natifs. Dans l'autre sens, vous pouvez exporter des données JSON binaires natives en tant que données textuelles, en remplaçant les valeurs JSON scalaires propres à Oracle par les objets JSON étendus textuels correspondants.

Conseil :

A titre d'exemple d'inspection, considérez un objet tel que {"dob" : "2000-01-02T00:00:00"} comme le résultat de la sérialisation des données JSON natives. "2000-01-02T00:00:00" est-il le résultat de la sérialisation d'une valeur binaire native de type date ou la valeur binaire native n'est-elle qu'une chaîne ? L'utilisation de json_serialize avec le mot-clé EXTENDED vous le permet.

La mise en correspondance des champs d'objet étendu avec les types JSON scalaires est, en général, de plusieurs à un : plus d'un type d'objet JSON étendu peut être mis en correspondance avec une valeur scalaire donnée. Par exemple, les objets JSON étendus {"$numberDecimal":"31"} et {"$numberLong:"31"} sont traduits en tant que valeur 31 du nombre de type scalaire en langue JSON, et la méthode d'élément type() renvoie "number" pour chacun de ces scalaires JSON.

La méthode d'élément type() indique le type scalaire en langue JSON de sa valeur cible (en tant que chaîne JSON). Certaines valeurs scalaires peuvent être distinguées en interne, même si elles ont le même type scalaire. Cela permet généralement à la fonction json_serialize (avec le mot-clé EXTENDED) de reconstruire l'objet JSON étendu d'origine. Ces valeurs scalaires sont distinguées en interne soit en utilisant des différents types SQL pour les implémenter, soit en les balisant avec le type d'objet JSON étendu à partir duquel elles ont été dérivées.

Lorsque json_serialize reconstruit l'objet JSON étendu d'origine, le résultat n'est pas toujours textuellement identique à l'objet d'origine, mais il est toujours sémantiquement équivalent. Par exemple, {"$numberDecimal":"31"} et {"$numberDecimal":31} sont sémantiquement équivalents, même si les valeurs de champ diffèrent par leur type (chaîne et nombre). Ils sont convertis en la même valeur interne, et chacun est marqué comme étant dérivé d'un objet étendu $numberDecimal (même balise). Mais lorsqu'il est sérialisé, le résultat pour les deux est {"$numberDecimal":31}. Oracle utilise toujours le type le plus directement pertinent pour la valeur de champ, qui dans ce cas est la valeur en langue JSON 31, de type scalaire.

Le tableau 3-1 présente les correspondances entre les différents types utilisés. Il est mis en correspondance entre (1) les types d'objet étendu utilisés en tant qu'entrée, (2) les types signalés par la méthode d'élément type(), (3) les types SQL utilisés en interne, (4) les types de langage JSON standard utilisés en tant que sortie par la fonction json_serialize et (5) les types d'objet étendu générés par json_serialize lorsque le mot-clé EXTENDED est spécifié.

Tableau 3-1 Relations étendues de type d'objet JSON

Type d'objet étendu (entrée) Type scalaire Oracle JSON (signalé par type()) Type scalaire SQL Type scalaire JSON standard (sortie) Type d'objet étendu (sortie)
$numberDouble avec une valeur numérique JSON, une chaîne représentant le nombre ou l'une des chaînes suivantes : "Infinity", "-Infinity", "Inf", "-Inf", "Nan"Pied de page 1 double BINARY_DOUBLE

nombre

$numberDouble avec une valeur numérique JSON ou l'une des chaînes suivantes : "Inf", "-Inf", "Nan"Pied de page 2
$numberFloat avec la même valeur que pour $numberDouble flottant BINARY_FLOAT

nombre

$numberFloat avec la même valeur que pour $numberDouble
$numberDecimal avec la même valeur que pour $numberDouble nombre NUMBER

nombre

$numberDecimal avec la même valeur que pour $numberDouble
$numberInt avec une valeur un entier signé de 32 bits ou une chaîne représentant le nombre nombre NUMBER

nombre

$numberInt avec la même valeur que pour $numberDouble
$numberLong avec une valeur numérique JSON ou une chaîne représentant le nombre nombre NUMBER

nombre

$numberLong avec la même valeur que pour $numberDouble

$binary avec l'une des valeurs suivantes :

  • une chaîne de caractères de base-64
  • Objet avec les champs base64 et subType, dont les valeurs sont une chaîne de caractères de base-64 et le nombre 0 (binaire arbitraire) ou 4 (UUID), respectivement.

Lorsque la valeur est une chaîne de caractères de base-64, l'objet étendu peut également avoir le champ $subtype avec la valeur 0 ou 4, exprimé sous la forme d'un entier d'un octet (0-255) ou d'une chaîne hexadécimale de 2 caractères. représentant un tel entier

binaire BLOB ou RAW

chaîne

Conversion équivaut à l'utilisation de la fonction SQL rawtohex.

Valeurs possibles :
  • $binary avec une valeur de chaîne de 64 caractères de base
  • $rawid avec une valeur de chaîne de 32 caractères hexadécimaux, si l'entrée avait une valeur subType de 4 (UUID)
$oid avec une valeur de chaîne de 24 caractères hexadécimaux binaire RAW(12)

chaîne

Conversion équivaut à l'utilisation de la fonction SQL rawtohex.

$rawid avec une valeur de chaîne de 24 caractères hexadécimaux
$rawhex avec une valeur une chaîne avec un nombre pair de caractères hexadécimaux binaire RAW

chaîne

Conversion équivaut à l'utilisation de la fonction SQL rawtohex.

$binary avec la valeur une chaîne de caractères de base-64, complétée à droite par des caractères =
$rawid avec une valeur de chaîne de 24 ou 32 caractères hexadécimaux binaire RAW

chaîne

Conversion équivaut à l'utilisation de la fonction SQL rawtohex.

$rawid
$oracleDate avec une valeur de chaîne de date ISO 8601 date DATE

chaîne

$oracleDate avec une valeur de chaîne de date ISO 8601
$oracleTimestamp avec une valeur de chaîne d'horodatage ISO 8601 horodatage TIMESTAMP

chaîne

$oracleTimestamp avec une valeur de chaîne d'horodatage ISO 8601
$oracleTimestampTZ avec une valeur de chaîne d'horodatage ISO 8601 avec un décalage de fuseau horaire numérique ou avec Z horodatage avec fuseau horaire TIMESTAMP WITH TIME ZONE

chaîne

$oracleTimestampTZ avec une valeur de chaîne d'horodatage ISO 8601 avec un décalage de fuseau horaire numérique ou avec Z

$date avec la valeur suivante :

  • Nombre entier de millisecondes depuis le 1er janvier 1990
  • Chaîne d'horodatage ISO 8601
  • Objet avec le champ numberLong dont la valeur est un nombre entier de millisecondes depuis le 1er janvier 1990
horodatage avec fuseau horaire TIMESTAMP WITH TIME ZONE

chaîne

$oracleTimestampTZ avec une valeur de chaîne d'horodatage ISO 8601 avec un décalage de fuseau horaire numérique ou avec Z
$intervalDaySecond avec une valeur correspondant à une chaîne d'intervalle ISO 8601, comme indiqué pour la fonction SQL to_dsinterval daysecondInterval INTERVAL DAY TO SECOND

chaîne

$intervalDaySecond avec une valeur correspondant à une chaîne d'intervalle ISO 8601, comme indiqué pour la fonction SQL to_dsinterval
$intervalYearMonth avec une valeur correspondant à une chaîne d'intervalle ISO 8601, comme indiqué pour la fonction SQL to_yminterval yearmonthInterval INTERVAL YEAR TO MONTH

chaîne

$intervalYearMonth avec une valeur correspondant à une chaîne d'intervalle ISO 8601, comme indiqué pour la fonction SQL to_yminterval

Deux champs :

  • Champ $vector avec valeur : tableau dont les éléments sont des nombres ou des chaînes "Nan", "Inf" et "-Inf" (représentant des valeurs non-a-number et infinies).

  • Champ $vectorElementType avec la valeur de chaîne "float32" ou "float64". Ceux-ci correspondent respectivement à des nombres IEEE 32 bits et IEEE 64 bits.

vecteur VECTOR

tableau de nombres

Deux champs :

  • Champ $vector avec valeur : tableau dont les éléments sont des nombres ou des chaînes "Nan", "Inf" et "-Inf" (représentant des valeurs non-a-number et infinies).

  • Champ $vectorElementType avec la valeur de chaîne "float32" ou "float64".

Note de bas de page 1 Les valeurs de chaîne sont interprétées sans tenir compte de la casse. Par exemple, "NAN" "nan" et "nAn" sont acceptés et équivalents, et de même "INF", "inFinity" et "iNf". Les nombres infiniment grands ("Infinity" ou "Inf") et petits ("-Infinity" ou "-Inf") sont acceptés avec le mot complet ou l'abréviation.

Note de bas de page 2 En sortie, seules ces valeurs de chaîne sont utilisées : aucune variante de mot complet Infinité ou de casse de lettre.