第十七章 Java版JSON文本初識(shí)
在上一章提到了JSON文本。JSON文本在學(xué)習(xí)指令前期估計(jì)只有/title和/tellraw會(huì)用到,所以我們這邊也就先認(rèn)識(shí)一下如何使用JSON文本顯示文本內(nèi)容。
JSON /?d?e?s?n/,全稱JavaScript Object Notation,是一種輕量級(jí)資料交換格式。而我們今天所要了解的,叫做JSON文本(JSON Text)。更確切的來說,是原始JSON文本(Raw JSON Text)。
需要注意,JSON≠JSON文本≠原始JSON文本。JSON有很多用途,不僅僅是拿來給你發(fā)消息用的。JSON文本嚴(yán)格來說指的是原始JSON文本經(jīng)過識(shí)別所轉(zhuǎn)化成我們?nèi)四軌蚩吹枚奈谋?,沒有帶JSON語(yǔ)法的那種,也就是最終的輸出形式。原始JSON文本既然帶有『原始』二字,那就是指還未經(jīng)過識(shí)別的JSON文本,也就是還處于原始形態(tài)并帶有JSON語(yǔ)法的JSON文本。
在Minecraft中,Java版和基巖版的JSON文本略有差別,但大體都相同。本章主要講的是Java版的原始JSON文本的使用,因?yàn)樵诨鶐r版,原始JSON文本在指令中使用程度并不高。我們會(huì)在第六十章講到基巖版的JSON文本。
如果你還沒搞懂,也沒關(guān)系,看下去就完事了。
原始JSON文本聽起來很高級(jí),讓人望而生畏,給人一種『作者似乎想要嘗試教會(huì)你們』的樣子,但其實(shí)它并不高級(jí),相反還很簡(jiǎn)單。
簡(jiǎn)單到什么程度呢?看:
““
這是一串沒有任何內(nèi)容的簡(jiǎn)寫JSON文本,如果將其識(shí)別,轉(zhuǎn)化為正式的輸出文本格式,那將會(huì)是一串空空如也的文本。
我們可以嘗試向里面加入一些東西,比如:
“Hello Minecraft“
這串JSON文本被識(shí)別后,也就是運(yùn)行『/tellraw @a “Hello Minecraft“』,將會(huì)輸出如下內(nèi)容:
Hello Minecraft
?。ㄗ⒁?,JSON文本的所有括號(hào)均為英文半角括號(hào),但閱文平臺(tái)會(huì)自動(dòng)將英文半角括號(hào)改為中文全角括號(hào),所以會(huì)有些奇怪)
是不是很簡(jiǎn)單?但你有沒有注意到,上面我提到『這是一串沒有任何內(nèi)容的簡(jiǎn)寫JSON文本』,注意『簡(jiǎn)寫』兩字。
所以它的真正形態(tài)是什么呢?如下:
{“text“:“Hello Minecraft“}
別害怕,這仍然很簡(jiǎn)單。
上面這就是剛才那個(gè)『“Hello Minecraft“』的真正形態(tài)。我們對(duì)這個(gè)完全體進(jìn)行解剖,可以得到如下內(nèi)容:
{——一個(gè)花括號(hào),這個(gè)花括號(hào)告訴游戲『嘿,這里是JSON文本的開始!』。游戲也根據(jù)它的形態(tài),判斷出接下來將是一個(gè)JSON對(duì)象。
“——一個(gè)英文半角括號(hào),這個(gè)括號(hào)告訴游戲『這里是一個(gè)字符串的開始!』
text ——一串英文。游戲暫且不知道這串英文的意思,于是它繼續(xù)看下去。
“——又是一個(gè)英文半角括號(hào),這個(gè)括號(hào)告訴游戲『這里是這個(gè)字符串的結(jié)束!』
:——一個(gè)英文半角冒號(hào),這個(gè)冒號(hào)告訴游戲『這里是這個(gè)組件(key-value pairs)的名稱與值的界限!』。游戲根據(jù)以往的經(jīng)驗(yàn),確認(rèn)剛剛遇見的『“text“』是這個(gè)組件的名稱(key),這個(gè)組件是一個(gè)text純文本內(nèi)容組件。
“——還是一個(gè)英文半角括號(hào),這個(gè)括號(hào)告訴游戲『這里是又一個(gè)字符串的開始!』
Hello Minecraft ——一串內(nèi)容,游戲根據(jù)前面得到的消息,確認(rèn)這是這個(gè)組件的值(value)。游戲因此得知,這個(gè)text純文本內(nèi)容組件將會(huì)顯示出『Hello Minecraft』。
“——最后一個(gè)英文半角括號(hào),這個(gè)括號(hào)告訴游戲『這里是這個(gè)字符串的結(jié)束!』
}——又一個(gè)花括號(hào),這個(gè)花括號(hào)告訴游戲『這里是JSON文本的結(jié)束!』
然后游戲根據(jù)以上信息,確認(rèn)這個(gè)原始JSON文本的意思是:顯示出一串文本(text),內(nèi)容為『Hello Minecraft』
我們也可以根據(jù)以上信息,了解了這個(gè)JSON文本:
?、龠@個(gè)JSON文本被一對(duì)花括號(hào)({})包圍,這對(duì)花括號(hào)標(biāo)志著這個(gè)JSON文本的開始和結(jié)束
?、谶@個(gè)JSON文本內(nèi)有兩個(gè)內(nèi)容,text和Hello Minecraft。這兩個(gè)內(nèi)容都是字符串,因此均被英文半角括號(hào)(““)所包裹著。一對(duì)英文半角括號(hào)標(biāo)志著一個(gè)字符串的開始和結(jié)束。
?、邸骸皌ext“』是組件的名稱(key),由于是字符串需要加上括號(hào),所以其中的text才是具體的名稱,意思為『文本』,標(biāo)志著這個(gè)組件的值是一串要被顯示出來的文本,也標(biāo)志著這個(gè)組件是一個(gè)純文本內(nèi)容組件。
?、堋骸癏ello Minecraft“』是這個(gè)組件的值(value),由于它是一個(gè)字符串,因此要被括號(hào)包裹著,所以Hello Minecraft才是值的內(nèi)容。這標(biāo)志著這個(gè)純文本內(nèi)容組件將會(huì)顯示出『Hello Minecraft』。
?、荨?』英文半角冒號(hào)是一對(duì)『組件名稱』與『組件值』的分界線,其左邊是名稱,右邊是值。
?、蕖骸皌ext“:“Hello Minecraft“』像這樣的由一對(duì)『名稱』和『值』組成的東西,叫做『組件』(key-value pairs)。
⑦一個(gè)組件的名稱規(guī)定了該組件是個(gè)什么東西,干什么用的。值則規(guī)定了該組件具體要干什么,怎么干。
?、嗳绻祷蚪M件名是一個(gè)字符串(組件名肯定是),那就得使用括號(hào)將其包裹起來。
⑧外面被花括號(hào)所包裹著的,里面有一個(gè)或多個(gè)組件的東西,就像『{“text“:“Hello Minecraft“}』這樣的,是一個(gè)JSON對(duì)象(Object)。
?。ㄗⅲ荷厦嫣岬降氖裁础航M件』之類的,是本書內(nèi)才有的叫法,僅為了方便大家理解,官方并無此叫法。『組件』的正式叫法是『鍵-值對(duì)』,又叫做『屬性-值對(duì)』、『欄位-值對(duì)』、『名稱-值對(duì)』。其中,『鍵-值對(duì)』的英文是『key-value pairs』)
這就是JSON的基礎(chǔ)語(yǔ)法,如果你能看懂上面的內(nèi)容,那就恭喜你,接下來的內(nèi)容對(duì)你來說將會(huì)相當(dāng)簡(jiǎn)單。
現(xiàn)在我們已經(jīng)知道名稱叫做text的組件,是純文本內(nèi)容組件。這個(gè)組件所輸出的內(nèi)容是一串平平無奇的文字,沒有顏色,也沒有什么特效。
如果我們想要給這串文字添加更多的特效,就要了解更多的組件及其使用方法。
在Minecraft Java的JSON文本中,可用的組件可以分為兩類:內(nèi)容組件和修飾組件。內(nèi)容組件用于規(guī)定每個(gè)JSON文本對(duì)象能夠表現(xiàn)出什么樣的內(nèi)容,一個(gè)JSON文本對(duì)象最多只能有一個(gè)內(nèi)容組件;修飾組件用于修飾內(nèi)容組件,一個(gè)JSON文本對(duì)象可以擁有多個(gè)修飾組件來對(duì)輸出的內(nèi)容進(jìn)行修飾。
內(nèi)容組件最基礎(chǔ)的是『text』,即上面接觸過的純文本內(nèi)容組件。
使用純文本內(nèi)容組件,可以顯示一串最簡(jiǎn)單的JSON文本,就像上面的那個(gè)JSON文本:
{“text“:“Hello Minecraft“}
需要注意,JSON文本是對(duì)大小寫敏感的,因此你不能寫成如下的樣子:
{“TEXT“:“Hello Minecraft“}
那樣子會(huì)報(bào)錯(cuò)。
上面顯示出來的Hello Minecraft是最基礎(chǔ)的白色。如果要更改文字顏色,那么就需要使用color組件(在Java版,JSON文本很難使用分節(jié)符)。
color的值是字符串,也就是說需要被引號(hào)包裹著。值支持17種顏色I(xiàn)D:
black(黑)、dark_blue(深藍(lán)色)、dark_green(深綠色)、dark_aqua(深湖藍(lán)色)、dark_red(深紅)、dark_purple(深紫)、gold(金色)、gray(灰色)、dark_gray(深灰色)、blue(藍(lán)色)、green(綠色)、aqua(湖藍(lán)色)、red(紅色)、light_purple(亮紫色)、yellow(黃色)、white(白色)和reset(取消顏色效果使用默認(rèn)顏色,一般使用于子JSON對(duì)象中)
比如:
{“text“:“Hello Minecraft“,“color“:“l(fā)ight_purple“}
就可以顯示一個(gè)淺紫色的“Hello Minecraft”。其中,color顏色組件修飾了text純文本內(nèi)容組件的顏色為淺紫色。不難發(fā)現(xiàn),如果有多個(gè)組件,就得使用英文半角逗號(hào)將它們分開。
如果你認(rèn)為這些顏色還不夠,你甚至可以使用HTML的十六進(jìn)制顏色格式來搞到更多的顏色。比如紅色的十六位顏色編碼就是:#ff0000,用到JSON文本里就是:
{“text“:“Hello Minecraft“,“color“:“#ff0000“}
關(guān)于HTML十六位顏色編碼的具體內(nèi)容自己上百度或谷歌搜,這兒就不多講了。
我們知道分節(jié)符§不僅可以更改文本顏色,還可以為文本添加更多的格式。那么在JSON中,我們?cè)撊绾螢橐淮甁SON文本添加格式呢?
§能添加五種文本格式,對(duì)應(yīng)到JSON中即是:
§k 亂碼對(duì)應(yīng)obfuscated模糊文本
§l 加粗對(duì)應(yīng)bold粗體
§m 刪除線對(duì)應(yīng)strikethrough刪除線
§n 下劃線對(duì)應(yīng)underlined下劃線
§o 斜體對(duì)應(yīng)italic斜體
上面的五個(gè)組件其值類型均為布爾值,也就是true(開啟)和false(關(guān)閉)。
在JSON文本中,布爾值和gamerule一樣,是使用true和false,并且并不需要添加括號(hào),因?yàn)椴皇亲址?p> 比如要為Hallo Minecraft添加斜體,你就需要這樣子:
{“text“:“Hello Minecraft“,“italic“:true}
其中,italic斜體修飾組件修飾了text內(nèi)容組件為斜體。你可以嘗試將italic改為其他組件,比如underlined、bold之類的。
現(xiàn)在我們已經(jīng)了解了Java版JSON文本的基本使用方法,基本上日常使用是沒有什么問題了。
不對(duì),還有一個(gè)問題!如果要在一串JSON文本里前面使用一種顏色或文本格式,后面使用另一種顏色或文本格式,那該怎么辦?
確實(shí),使用花括號(hào)包裹的JSON文本,也就是JSON文本對(duì)象,就算修飾組件能夠含有多個(gè),具體下來其實(shí)每個(gè)組件也只能包含一個(gè),還沒有什么先后順序。
那怎么辦呢?能不能一次性就使用多個(gè)JSON文本對(duì)象呢?
答案是可以的。
我們可以將多個(gè)JSON文本對(duì)象排成一個(gè)陣列,組成一個(gè)JSON文本對(duì)象列表。
什么是列表?顧名思義,就是將各種東西列在一起的表格。在JSON中,列表內(nèi)的內(nèi)容一般都是相同類型,比如都是小數(shù),都是整數(shù),都是字符串,內(nèi)容與內(nèi)容之間用英文半角逗號(hào)分開,外側(cè)用中括號(hào)包裹起來,這樣子就形成了一個(gè)JSON列表。
比如下面就是一個(gè)全都是整數(shù)的JSON列表:
[1,2,3,4,5,6]
那既然列表內(nèi)可以放數(shù)字,那能不能放字符串、布爾值,甚至是JSON對(duì)象呢?
答案也是可以的。
比如下面這樣子:
[{“text“:“Hello“,“color“:“blue“},{“text“:“Minecraft“,“color“:“black“},“Launcher“]
JSON文本在解析的時(shí)候,會(huì)按照我們正常人所認(rèn)為的順序,即從左到右解析。這樣子就可以實(shí)現(xiàn)Hello是藍(lán)色,Minecraft是黑色,Launcher是藍(lán)色。
等等,為什么Launcher是藍(lán)色而不是白色?
因?yàn)樵谝粋€(gè)JSON列表中,列表前面的JSON對(duì)象定義了文本顏色,這個(gè)顏色就會(huì)傳遞下去,就算中途有其他對(duì)象使用了color改變了其他顏色,也只是作用在這個(gè)對(duì)象內(nèi),下一個(gè)對(duì)象還是使用這個(gè)顏色。文本格式也是一樣的道理。
現(xiàn)在就沒什么問題了吧?
需要注意一下,Java1.9版本之前的JSON,組件名不需要額外加括號(hào),也就是說在Minecraft Java1.8版本,你可以直接這樣子:
{text:“Hello Minecraft“}
Java JSON歷史:
1.7.2——加入了/tellraw,第一次有指令支持了JSON
1.8——加入了使用JSON的/title。告示牌和成書也開始使用JSON文本。
1.13——自定義名稱使用了JSON文本。加入了name參數(shù)使用JSON的/bossbar指令。
1.14——物品描述標(biāo)簽支持JSON文本。
1.16——color可以使用HTML十六位顏色碼來更改文本顏色(需要注意這個(gè)功能是這時(shí)候才添加的)。
......
......
......
As we know ,we can't type § into the chatbox. So can we type the Unicode of § into the chatbox?
The answer to the question is no.
So can we type it by using tellraw?
I can say, the way is feasible in Minecraft Java 1.12.2.
Now, let us run Minecraft Java 1.12.2, and create a new world in creative mode.Remember to allow cheats.
After the world was created ,please run the following command:
/give @s command_block
I'm sure that you must have a command block now.Please set it on the ground.
Right click to open the GUI,then enter the following command:
/tellraw @p {“text“:“\u00a7bHello Minecraft“}
Click the Done button to return the game.Take a lever out of your bag.Set it next the command block.
Now let's pull the lever.The moment the lever is pulled, a line of light blue text appear surprisedly! Yes, as you looked, we can use the Unicode of § in JSON Text! Have you learned it?
If you want to learn about it more, please search “在原版中更改任意文字顏色“ in MCBBS.You will find a post by a great command veteran in 2015.