lundi 10 septembre 2018

L'encodage d'objet DICOM - Format JSON

La partie PS3.18 (Annexe F) du standard définit un encodage des objets DICOM au format JSON. Ce modèle de représentation est appelé « DICOM JSON Model ».
Tout comme le format XML, JSON est 100% textuel, indépendant d'un langage (on respecte la notion d'universalité - cf. Introduction) et utilisé pour transférer des structures de données légères.

« DICOM JSON Model » complémente le format XML « Native DICOM Model ». Tout comme le format XML, le format JSON pourrait être utilisé pour échanger des objets DICOM, mais le standard recommande de ne l'employer que dans des cas bien précis, tels que des applications mobiles qui utiliseraient les services Web DICOM (QIDO-RS par exemple).

Ces applications n'ont pas besoin de savoir lire des objets DICOM standard, et donc d'embarquer des bibliothèques particulières permettant de décoder du DICOM.

Remarque : Que ce soit l'encodage XML ou JSON, ces deux alternatives sont très proches l'une de l'autre car elles permettent d'avoir une représentation 100% textuelle de l'objet DICOM et de ne se reposer que sur des outils standards de traitement XML ou JSON. Le choix entre JSON et XML est donc assez subjectif.
Actuellement, le standard recommande le format XML pour des traitements sur un serveur (validation ou coercition d'attributs par exemple) et le format JSON pour les transferts réseaux sur les applications mobiles en DICOM web (métadonnées dicom). JSON étant moins verbeux que XML, ce choix de format pourrait être amené à disparaître avec le développement des outils JSON qui permettraient d'être iso-fonctionnel par rapport aux outils XML.

Il est vivement conseillé d'avoir lu les parties Encodage Classique - partie 1 et Encodage Classique - partie 2 pour comprendre ce billet.

1. Présentation de JSON


Le format JSON utilise une syntaxe très simple mais qui permet de représenter n'importe quelle donnée. Cette syntaxe est composée de 4 types primitifs et 2 types structurés.

1.1 Les types primitifs

  • Strings :  une séquence de 0 ou n caractères Unicode. Elles sont obligatoirement entourées de guillemets (non interchangeables avec des apostrophes) ;
  • Numbers : un nombre décimal signé qui peut contenir une part fractionnable ou élevée à la puissance. JSON ne permet pas les nombres inexistants (NaN), et ne fait aucune différence entre un entier et un flottant ;
  • booleans: Permet de représenter un booléen. Deux valeurs sont autorisées « true » ou « false » ;
  • null: indique une valeur vide, utilisant le mot clé « null ».

1.2 Les types structurés

  • Les Objets : Un objet (object) est un ensemble de paires « clé:valeur ».  La « clé » est de type « string », suivie du caractère « : » puis de la « valeur ». Chaque paire composant l'objet est séparée de la précédente par le caractère « , ». Un objet commence par le caractère « { » et termine par le caractère « } » ;

  • Les tableaux : Un tableau (array) est une collection de plusieurs valeurs. Il commence par le caractère « [ » et termine par le caractère « ] ». Chaque valeur est séparée de la précédente par le caractère « , ».
Dans une paire « clé:valeur », la valeur peut être d'un des 6 types présentés ci-dessus.


Exemple d'objet JSON simple:
{
 "nom":"Dupond",
 "prenoms":["Jean", "Paul", "Jacques"],
 "age":37,
 "representantLegal":null,
 "fumeur":true
}

Exemple d'objet JSON complexe (structures JSON imbriquées)
{
 "nom":"Dupond",
 "prenoms":["Marie"],
 "age":12,
 "representantLegal":{
   "nom":"Dupond",
   "prenoms":["Jean", "Paul", "Jacques"],
   "age":37,
   "representantLegal":null,
   "fumeur":true
 },
 "fumeur":false
}

2. Encodage DICOM


En DICOM, la brique de base d'un objet est le Data Element. Cet élément est représenté en JSON par la syntaxe suivante :

"ggggeeee": {
  "vr": ... ,
  "Value" | "InlineBinary" | "BulkDataURI": ...
}

Un Data Element est représenté par une paire « clé:valeur » dont la « clé » est formée des 8 caractères en capital de l'identifiant hexadécimal du tag DICOM (ggggeeee, ou gggg est le groupe et eeee l'élément dans le groupe). La valeur est un objet JSON composé de deux sous paires. La première (« vr ») permet de représenter le type du Data Element. La seconde paire (que l'on appellera « content ») indique la valeur du Data Element. En fonction de la VR, la « clé » de content peut prendre une des valeurs suivantes: Value, InlineBinary ou BulkDataURI.

Le tableau suivant résume le mapping entre chaque VR DICOM, le type JSON associé, et la clé de la représentation JSON de la valeur d'un Data Element. Le mapping entre les VR DICOM et les types JSON est disponible dans la partie PS3.18 - Annexe F2.3.


VR Clé de content Type JSON de content
AE
Value
String
AS
Value
String
AT
Value
String
CS
Value
String
DA
Value
String
DS
Value
Number
DT
Value
String
FL
Value
Number
FD
Value
Number
IS
Value
Number
LO
Value
String
LT
Value
String
OB
InlineBinary ou BulkDataURI
si InlineBinary : Flux d'octet encodé en Base64
si BulkDataURI: String
OD
InlineBinary ou BulkDataURI
si InlineBinary : Flux d'octet encodé en Base64
si BulkDataURI: String
OF
InlineBinary ou BulkDataURI
si InlineBinary : Flux d'octet encodé en Base64
si BulkDataURI: String
OL
InlineBinary ou BulkDataURI
si InlineBinary : Flux d'octet encodé en Base64
si BulkDataURI: String
OW
InlineBinary ou BulkDataURI
si InlineBinary : Flux d'octet encodé en Base64
si BulkDataURI: String
PN
Value
Tableau de systèmes d'écritures
SH
Value
String
SL
Value
Number
SQ
Value
Tableau de DICOM JSON Objects
SS
Value
Number
ST
Value
String
TM
Value
String
UC
Value
String
UI
Value
String
UL
Value
Number
UN
InlineBinary ou BulkDataURI
Flux d'octet encodé en Base64
UR
Value
String
US
Value
Number
UT
Value
String

Remarque: Au format JSON, un objet DICOM est appelé « DICOM JSON Object ».

2.1. L'élément « Value »


2.1.1. Cas général


Pour les Data Element ayant une VR autre que PN, SQ, OB, OD, OF, OL, OW ou UN, l'élément « Value » contient un tableau de valeurs. En effet, un Data Element pouvant avoir plusieurs valeurs, cette caractéristique est représentée en JSON par un tableau.

Exemple 1 - Tableau d'un élément:
"00100020": {
 "vr": "LO",
 "value": ["12345"]
}

Exemple 2 - Tableau de plusieurs éléments:
"00080061": {
  "vr": "CS",
  "value": ["CT", "PET"]
}

2.1.2. Cas du type PN


Pour les Data Element avec une VR PN, « Value » contient un tableau d'objets JSON. Chaque objet de ce tableau peut contenir trois éléments : Alphabetic, Ideographic et Phonetic.
Chacun de ces 3 éléments a pour valeur une chaîne de caractères qui respecte le formalisme suivant :

FamilyName^GivenName^MiddleName^NamePrefix^NameSuffix.

Tout comme pour les autres systèmes d'encodages DICOM (classique ou XML), chacun des composants  FamilyName, GivenName, MiddleName, NamePrefix et NameSuffix est optionnel.

Exemple:
"00100010": {
  "vr":"PN",
   "value":[{
      "Alphabetic":"Yamada^Tarou",
      "Ideographic":"山田^太郎",
      "Phonetic":"やまだ^たろう"
   }]
}

2.1.3. Cas du type SQ


Pour les Data Element avec une VR SQ, « Value » contient un tableau d'objets JSON. Chacun de ces objets représente un Item de la séquence. Chaque Item étant à son tour un « JSON DICOM Object ».

Exemple:
"00081110":{
 "vr":"SQ",
 "value":[{
    "00081150":{
    "vr":"UI",
    "value":["1.2.840.10008.3.1.2.3.1"]
   },
   "00081155":{
    "vr":"UI",
    "value":["1.2.3.4.5.6"]
   }
  }]
}

2.2. L'élément « InlineBinary »


Cet élément permet d'encoder en base64 la valeur des Data Element dont la VR est OB, OD, OF, OW, ou UN. En effet, les VR précédemment citées contiennent des données binaires. Or JSON étant un langage textuel, il est nécessaire de convertir les données binaires au format texte. DICOM a choisi d'utiliser l'encodage base64 pour effectuer cette transformation.

Exemple:
"7FE00010":{
  "vr":"OW",
  "InlineBinary":"Qm9uam91ciDDoCB0b2k="
}

Remarque : Tout comme en XML, l'encodage de données binaires en base64 alourdit la taille de l'objet JSON. L'encodage JSON n'est donc pas optimal pour le transfert d'objet DICOM.

2.3. L'élément « BulkDataURI »


Cet élément permet d'encoder une référence à un blob (Binary Large OBject). Le but étant d'éviter de stocker de larges données DICOM dans une structure JSON. Ce blob peut être situé localement sur un système de fichiers ou encore sur un réseau.

Exemple 1 - blob situé localement sur un système de fichiers:
"7FE00010":{
  "vr":"OW",
  "BulkDataURI":"file:/C:/monRep/file.dcm?offset=16&length=524"
}

Exemple 2 - blob situé sur un réseau:
"7FE00010":{
  "vr":"OW",
  "BulkDataURI":"http://server/rs/studies/1.2.3/series/5.6.7"
}


3. Exemple d'un objet DICOM encodé en JSON


Un exemple est disponible dans le standard dans l'annexe PS3.18 Annexe F.4.

Un exemple de fichier DICOM complet au format JSON est également disponible ici.

Aucun commentaire:

Enregistrer un commentaire