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.
Il est vivement conseillé d'avoir lu les parties Encodage Classique - partie 1 et Encodage Classique - partie 2 pour comprendre ce billet.
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.
Exemple d'objet JSON simple:
Exemple d'objet JSON complexe (structures JSON imbriquées)
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 :
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.
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:
Exemple 2 - Tableau de plusieurs éléments:
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 :
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:
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:
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:
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:
Exemple 2 - blob situé sur un réseau:
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.
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.
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 « , ».
Exemple d'objet JSON simple:
{
"nom":"Dupond",
"prenoms":["Jean", "Paul", "Jacques"],
"age":37,
"representantLegal":null,
"fumeur":true
}
"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
}
"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": ...
}
"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"]
}
"vr": "LO",
"value": ["12345"]
}
Exemple 2 - Tableau de plusieurs éléments:
"00080061": {
"vr": "CS",
"value": ["CT", "PET"]
}
"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":"やまだ^たろう"
}]
}
"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"]
}
}]
}
"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="
}
"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"
}
"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"
}
"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