==========
下圖是所有屬於Primitive Type的資料型態。(Element請參考概念)
從簡化的角度,資料型態說穿了,就只有數值、字串與時間。JSON所支援的資料型態就知可以很簡化,如:
- string
- number
- object
- array
- boolean
- null
- string
- number
- object
- array
- boolean
- null
數值類
- boolean
這個好懂吧,就是bit,就是二元,不是真(true),就是假(false)。不像v3還有搞什麼空值有的沒有的。還有一點要注意,不能像C那樣,用1,0 來代表真假。
Regex:
true|false
- integer
整數,是數值類的一種,沒有小數點,這好懂吧。他的範圍是在−2,147,483,648..2,147,483,647(就是32bit)。如果超過此數值範圍者,使用decimal。
Regex:
但從程式語言的角度,整數從所使用的位元數,以及正負號來說,其實還有多種型態。下列是C#的整數型別。
注意看,其實有分正數,或者有無帶符號之別。所以在HL7 FHIR中,整數之下,又多了兩個資料型態unsignedInt與positivenInt
Regex:
[0]|[-+]?[1-9][0-9]*
但從程式語言的角度,整數從所使用的位元數,以及正負號來說,其實還有多種型態。下列是C#的整數型別。
注意看,其實有分正數,或者有無帶符號之別。所以在HL7 FHIR中,整數之下,又多了兩個資料型態unsignedInt與positivenInt
- unsignedInt
不帶正負號的32位元整數。實際上,少了一個位元攜帶正負號,所以他的數值範圍應該是從0到4,294,967,295。可是,FHIR文件中卻是0~2,147,483,647。Regex:
[0]|([1-9][0-9]*)
- positiveInt
這個跟unsignedInt的差異,就在於有沒有一個0。範圍是從1~2,147,483,647。
Regex:
+?[1-9][0-9]*
- decimal
十進制,是數值類的一種,為實數型態,甚至說integer是衍生自他。
Regex:
就C#的角度,他是屬於浮點數型別,是有小數點的。這類包含有:
decimal是 128 位元的資料型別,適合財務和貨幣計算。在FHIR中所有浮點都是decimal,沒有float與double了。(XML有,JSON當然只有Numbers打死一切)
明顯衍生自string的資料型態有:code, markdown與id。(有明顯,就有隱含)
Regex:
以下就是隱含衍生自string的資料型態。
就是字串,是經過base64編碼過的字串。當然要遵循 RFC 4648 。
Regex:
Regex:
-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
就C#的角度,他是屬於浮點數型別,是有小數點的。這類包含有:
decimal是 128 位元的資料型別,適合財務和貨幣計算。在FHIR中所有浮點都是decimal,沒有float與double了。(XML有,JSON當然只有Numbers打死一切)
字串類
- string
一系列Unicode字元之組合。
在程式語言中,這是常見之資料型態。但在FHIR中有幾點需注意:
- 長度不可以超過1MB。
- 不能使用Unicode前32個,除非是下列:
- u0009 (horizontal tab)
- u0010 (carriage return)
- u0013 (line feed)
- 雖然字串前後可以加空白,但受限於XML忽視空白的機制,轉換成XML時,要遵守 removed when using the XML format (這個要到談Resource Format時)。
- 繞一圈,在FHIR中,字串應該是不包含空白的內容。
Regex:
[ \r\n\t\S]+
- id
可以是'A'~'Z', 'a'~'z', '0'~'9', '-', '.'。總長度限制在64個字元。
Regex:
[A-Za-z0-9\-\.]{1,64}
- code
其內容是字串,但被限定於某特定集合範圍中。這個內容前後不會有空白,或者只能有一個空白(就是在集合中找不到值)。
Regex: [^\s]+(\s[^\s]+)*
- markdown
就是字串,只是這個字串內容包含了markdown的文法標記,可讓能處理markdow字串者,能展現排版後的內容。
Regex:
\s*(\S|\s)*
- base64Binary
就是字串,是經過base64編碼過的字串。當然要遵循 RFC 4648 。Regex:
(\s*([0-9a-zA-Z\+\=]){4}\s*)+
- uri
他的英文全名為Uniform Resource Identifier Reference,其規範文件是RFC 3986。注意,這個是大小寫視為不同。
很多人對於URI, URL, URN搞的一頭霧水的人,又有研究精神的人,可以參考RFC 3305這份文件。(你真的很想看這樣子的文件,請服用這個http://www.rfcreader.com/)
我個人認知URI是一個父物件,提供一種基本定義。這個基本定義有個很重要的概念是命名空間(Namespace)。也就是說,不同的命名空間,也就形成了不同應用情境。其中若採用http:這樣的命名空間,我們給一個特定名稱叫URL。另外URN也是URI中的某一種命名空間,他的特定符號是urn:。指向一份擺在網路空間的文件(非網頁),可能就會用到urn:。希望能理解,無法理解也無所謂,除非你要成為標準制定者。
所以衍生自uri的資料型態有:url, canonical, uuid, oid。
- url
有了uri的解說,應該可以接受下列說法。凡使用http{s}:、ftp:、mailto:與mllp:當命名空間所形成的uri都屬於url的資料型態。
- canonical
許多資源會有自己的URL (但他不是網頁,這樣講也不對,是說這個網頁定義了這個資源)。一般而言,術語類(terminology)、一致性(conformance)或者知識資源(knowledge)都屬於這個資料型態。例如
<valueSet value="http://hl7.org/fhir/ValueSet/my-valueset"/>
這是說指定資料集(valueSet 也是一種FHIR Resource),來自http://hl7.org/fhir/ValueSet/my-valueset。
- uuid (GUID)
其規範文件是RFC 4122。形式為8-4-4-4-8。他屬於urn下的uuid命名空間。例如urn:uuid:c757873d-ec9a-4326-a141-556f43239520。
- oid
其規範文件是RFC 3301。例如:urn:oid:1.2.3.4.5。
Regex: urn:oid:[0-2](\.(0|[1-9][0-9]*))+
為什麼oid的首字只能是0,1或2呢?那就只好來全世界OID註冊網站(http://www.oid-info.com)來瞧瞧。
懂了嗎?
urn:oid:[0-2](\.(0|[1-9][0-9]*))+
時間類
屬於時間類的資料型態有四種,其實概念一樣,只是格式不同。
- dateTime
這是基本型,包含了日期(date)與時間(time)。不過,他可以有簡化型,也就是可以只有年(year),或者年與月(year + month)。(為什麼沒有單獨月與日呢?那就變成數值資料型態了)
以下都是符合dateTime的格式:
- YYYY
- YYYY-MM
- YYYY-MM-DD
- YYYY-MM-DDThh:mm:ss+zz:zz (注意那個T固定值,非替代)
從程式語言的角度,會比這個更複雜,要注意。
- date
有了dateTime之後,這個容易理解了吧。就是只包含日期的部分。以下都是符合date的格式:
- YYYY
- YYYY-MM
- YYYY-MM-DD
- time
代表某一天的時間點。但要注意,dateTime的時間部分,有包含時區。但是time沒有包含時區。符合格式一定是hh:mm:ss。
- instant
這個翻譯成瞬間,就是那一剎哪。所以,他是dataTime,但不接受簡化型。他的格式一定要符合YYYY-MM-DDThh:mm:ss.sss+zz:zz。
==========
你想深入搞定HL7 FHIR,這些資料型態一定要搞懂。否則,你也只是嘴巴說會HL7 FHIR(台灣不缺這樣子的人)
沒有留言:
張貼留言