Kerangka resource JSON; Patient: id vs identifier
Membaca JSON FHIR R4 seperti membaca tipe TypeScript: bagian bersama setiap resource, aturan JSON, cardinality, dan id vs Identifier
Di lesson 0003 Anda mengenal profile, extension, dan Implementation Guide sebagai konsep. Modul ini membuka isi resource-nya: JSON yang akan Anda baca dan tulis setiap hari. Mulai dari kerangka yang dimiliki semua resource, lalu Patient.
resourceType, id, meta, text, contained, extension),
menerapkan aturan JSON FHIR (tanpa null, elemen berulang selalu array) dan membaca cardinality sebagai tipe TypeScript,
serta menjelaskan beda id dan identifier tanpa catatan.
Semua JSON di lesson ini diadaptasi (dipendekkan) dari contoh resmi spesifikasi FHIR R4 (4.0.1); tautannya ada di setiap blok. Tanpa lab: cukup baca, jawab kuis, lalu latihan lisan. Kuis di sini adalah feedback cepat; bukti penguasaan hanya dari review campuran 0012.
1. Kerangka setiap resource, dan aturan JSON-nya (±8 menit)
Hampir semua resource diturunkan dari DomainResource, yang diturunkan dari Resource. Jadi setiap Patient, Encounter, atau Observation punya bagian bersama yang sama, lalu elemen khasnya sendiri. [1] [7]
| Property | Dari | Isi |
|---|---|---|
resourceType | JSON | nama tipe resource; di JSON jenis resource "is carried as the property resourceType" [4] |
id | Resource | logical id (bagian 2) |
meta | Resource | versionId, lastUpdated, profile, … (lesson 0007) |
text | DomainResource | narrative XHTML untuk dibaca manusia |
contained | DomainResource | resource lain yang disisipkan (lesson 0007) |
extension, modifierExtension | DomainResource | data tambahan di luar definisi inti (lesson 0007) |
Aturan JSON yang paling sering menjebak developer JavaScript [4]:
- Tidak ada
nulldan tidak ada nilai kosong. "JSON objects and arrays are never empty, and properties never have null values ... Omit a property if it is empty." Di TypeScript, semua elemen opsional adalah?:, bukan| null. - Elemen yang bisa berulang selalu array, walau isinya satu: "arrays are used when the item might repeat, even if it does not repeat in a specific instance". Nama array tetap tunggal (
name,identifier,coding). - Urutan property tidak bermakna, tapi "order within an array SHALL be maintained". Parser juga tidak boleh menganggap
resourceTypeselalu di depan. - Nama property case-sensitive.
Yang menentukan "selalu array" atau "objek tunggal" adalah cardinality di definisi resource: "the lower and upper bounds on how many times this element is allowed to appear". [3] Cara membacanya sebagai tipe TypeScript:
| Cardinality | Arti | Padanan TS | Contoh R4 |
|---|---|---|---|
0..1 | opsional, paling banyak satu | gender?: string | Patient.gender |
1..1 | wajib, tepat satu | status: string | Observation.status, Observation.code |
0..* | opsional, boleh banyak | name?: HumanName[] | Patient.name, Patient.identifier |
1..* | wajib, minimal satu | type: Coding[] (non-empty) | Signature.type |
Kardinalitas contoh: [5] [6] [2].
Di tabel definisi juga ada flag: ?! = modifier element (mengubah makna elemen lain, mis. Patient.active, Observation.status) dan Σ = bagian dari summary. [3]
Latihan 1 — JSON dan cardinality
2. Patient: id vs identifier (±10 menit)
Patient adalah "Demographics and other administrative information about an individual or animal receiving care". [5] Potongan contoh resmi: [8]
{
"resourceType": "Patient",
"id": "example", // logical id: dari server, bagian URL
"identifier": [{ // business identifier: 0..*, selalu array
"use": "usual",
"type": { "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/v2-0203", "code": "MR" }] },
"system": "urn:oid:1.2.36.146.595.217.0.1", // namespace: "siapa yang menjamin unik"
"value": "12345", // nomor rekam medis (MR)
"assigner": { "display": "Acme Healthcare" }
}],
"active": true,
"name": [
{ "use": "official", "family": "Chalmers", "given": ["Peter", "James"] },
{ "use": "usual", "given": ["Jim"] }
],
"gender": "male",
"birthDate": "1974-12-25",
"deceasedBoolean": false, // choice type deceased[x] (lesson 0006)
"managingOrganization": { "reference": "Organization/1" }
}
id (logical id) | identifier (business identifier) | |
|---|---|---|
| Siapa yang menetapkan | server yang menyimpan resource | organisasi/sistem dunia nyata (RS, negara, lab) |
| Bentuk | satu string, maks. 64 karakter [A-Za-z0-9\-\.] | objek system + value (+ use, type, period, assigner), boleh banyak |
| Cakupan unik | per tipe resource, di server itu | di dalam system-nya |
| Berubah? | "Once assigned by the server, the id is never changed"; tapi bisa berbeda di server lain | tetap sama di semua salinan resource |
| Dipakai untuk | URL: [base]/Patient/example, Reference | mencocokkan entitas antar sistem; search ?identifier=system|value |
| Padanan | primary key (surrogate) di database Anda | natural key: nomor RM, NIK |
Kutipan dan aturan tabel: [1] [2]
- Spesifikasi memberi contoh pasien yang sama di dua server,
Patient/23danPatient/5860200e-…, dengan identifier sama: "Given that the identifier is the same, the patient resources are understood to mean that they describe the same patient." [1] Identifier.value"SHALL be unique within the defined system".systemadalah URI namespace; kalau tidak ada system, "no useful matching may be performed using the value". [2]- Logical id bersifat "opaque": jangan mem-parsing strukturnya. [1]
Latihan 2 — id atau identifier?
Latihan 3 — Ucapkan dengan suara keras
Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai.
"Apa bedaiddanidentifierdi resource FHIR? Bagaimana Observation menunjuk ke pasiennya?" (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya
"id adalah logical id: ditetapkan server yang menyimpan resource, unik per tipe resource di server itu, tidak pernah berubah, dan membentuk URL-nya, misalnya Patient/123.
Kalau resource disalin ke server lain, id-nya bisa berbeda. identifier adalah business identifier, seperti nomor rekam medis atau NIK: pasangan system (URI namespace) + value, dan bisa banyak.
Dua resource dengan identifier sama dianggap entitas yang sama. Observation menunjuk pasien lewat Reference di subject: biasanya literal reference relatif Patient/123, opsional dengan display untuk UI.
Kalau URL-nya tidak diketahui, bisa logical reference lewat subject.identifier, tapi chaining dan _include tidak jalan.
Padanannya: id itu primary key database, identifier itu natural key, reference itu foreign key."
Checklist: apakah Anda menyebut…
- id = logical id dari server, unik per tipe di server itu, tidak berubah?
- id membentuk URL resource ([base]/Patient/123) dan bisa berbeda antar server?
- identifier = business identifier (system + value), mis. nomor rekam medis/NIK, boleh banyak?
- identifier sama = entitas dunia nyata yang sama, dipakai untuk mencocokkan antar sistem?
- Reference relatif Patient/123 di subject, display hanya teks untuk ditampilkan?
- logical reference lewat Reference.identifier bila URL tidak diketahui (tanpa chaining/_include)?
Lulus kalau minimal 4 dari 6.
Ringkasan untuk dicetak: Reference: Anatomi resource + datatype · Istilah: GLOSSARY.md (bagian "Resource dan datatype")
Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "kapan Observation memakai component alih-alih beberapa Observation?", "bagaimana mengetik resource FHIR di TypeScript tanpa menulis semuanya sendiri?", atau "apa beda ValueSet dan CodeSystem?"
Sumber (semua diakses 26 Oktober 2026): [1] Resource · [2] Data Types · [3] Resource Formats · [4] JSON Representation · [5] Patient · [6] Observation · [7] DomainResource · [8] Contoh Patient