UU看書

第十七章 Java版JSON文字初識

天才一秒記住【UU看書】地址:www.uukanshu.co

在上一章提到了JSON文字。JSON文字在學習指令前期估計只有title和tellraw會用到,所以我們這邊也就先認識一下如何使用JSON文字顯示文字內容。

JSONˈdʒeɪsən,全稱JavaScriptObjectNotation,是一種輕量級資料交換格式。而我們今天所要了解的,叫做JSON文字(JSONText)。更確切的來說,是原始JSON文字(RawJSONText)。

需要注意,JSON≠JSON文字≠原始JSON文字。JSON有很多用途,不僅僅是拿來給你發訊息用的。JSON文字嚴格來說指的是原始JSON文字經過識別所轉化成我們人能夠看得懂的文字,沒有帶JSON語法的那種,也就是最終的輸出形式。原始JSON文字既然帶有『原始』二字,那就是指還未經過識別的JSON文字,也就是還處於原始形態並帶有JSON語法的JSON文字。

在Minecraft中,Java版和基岩版的JSON文字略有差別,但大體都相同。本章主要講的是Java版的原始JSON文字的使用,因為在基岩版,原始JSON文字在指令中使用程度並不高。我們會在第六十章講到基岩版的JSON文字。

如果你還沒搞懂,也沒關係,看下去就完事了。

原始JSON文字聽起來很高階,讓人望而生畏,給人一種『作者似乎想要嘗試教會你們』的樣子,但其實它並不高階,相反還很簡單。

簡單到什麼程度呢?看:

““

這是一串沒有任何內容的簡寫JSON文字,如果將其識別,轉化為正式的輸出文字格式,那將會是一串空空如也的文字。

我們可以嘗試向裡面加入一些東西,比如:

“HelloMinecraft“

這串JSON文字被識別後,也就是執行『tellrawa“HelloMinecraft“』,將會輸出如下內容:

HelloMinecraft

(注意,JSON文字的所有括號均為英文半形括號,但閱文平臺會自動將英文半形括號改為中文全形括號,所以會有些奇怪)

是不是很簡單?但你有沒有注意到,上面我提到『這是一串沒有任何內容的簡寫JSON文字』,注意『簡寫』兩字。

所以它的真正形態是什麼呢?如下:

“text““HelloMinecraft“

別害怕,這仍然很簡單。

上面這就是剛才那個『“HelloMinecraft“』的真正形態。我們對這個完全體進行解剖,可以得到如下內容:

——一個花括號,這個花括號告訴遊戲『嘿,這裡是JSON文字的開始!』。遊戲也根據它的形態,判斷出接下來將是一個JSON物件。

“——一個英文半形括號,這個括號告訴遊戲『這裡是一個字串的開始!』

text——一串英文。遊戲暫且不知道這串英文的意思,於是它繼續看下去。

“——又是一個英文半形括號,這個括號告訴遊戲『這裡是這個字串的結束!』

——一個英文半形冒號,這個冒號告訴遊戲『這裡是這個元件keyvaluepairs的名稱與值的界限!』。遊戲根據以往的經驗,確認剛剛遇見的『“text“』是這個元件的名稱(key),這個元件是一個text純文字內容元件。

“——還是一個英文半形括號,這個括號告訴遊戲『這裡是又一個字串的開始!』

HelloMinecraft——一串內容,遊戲根據前面得到的訊息,確認這是這個元件的值(value)。遊戲因此得知,這個text純文字內容元件將會顯示出『HelloMinecraft』。

“——最後一個英文半形括號,這個括號告訴遊戲『這裡是這個字串的結束!』

——又一個花括號,這個花括號告訴遊戲『這裡是JSON文字的結束!』

然後遊戲根據以上資訊,確認這個原始JSON文字的意思是:顯示出一串文字(text),內容為『HelloMinecraft』

我們也可以根據以上資訊,瞭解了這個JSON文字:

①這個JSON文字被一對花括號()包圍,這對花括號標誌著這個JSON文字的開始和結束

②這個JSON文字內有兩個內容,text和HelloMinecraft。這兩個內容都是字串,因此均被英文半形括號(““)所包裹著。一對英文半形括號標誌著一個字串的開始和結束。

③『“text“』是元件的名稱(key),由於是字串需要加上括號,所以其中的text才是具體的名稱,意思為『文字』,標誌著這個元件的值是一串要被顯示出來的文字,也標誌著這個元件是一個純文字內容元件。

④『“HelloMinecraft“』是這個元件的值(value),由於它是一個字串,因此要被括號包裹著,所以HelloMinecraft才是值的內容。這標誌著這個純文字內容元件將會顯示出『HelloMinecraft』。

⑤『』英文半形冒號是一對『元件名稱』與『元件值』的分界線,其左邊是名稱,右邊是值。

⑥『“text““HelloMinecraft“』像這樣的由一對『名稱』和『值』組成的東西,叫做『元件』keyvaluepairs。

⑦一個元件的名稱規定了該元件是個什麼東西,幹什麼用的。值則規定了該元件具體要幹什麼,怎麼幹。

⑧如果值或元件名是一個字串(元件名肯定是),那就得使用括號將其包裹起來。

⑧外面被花括號所包裹著的,裡面有一個或多個元件的東西,就像『“text““HelloMinecraft“』這樣的,是一個JSON物件Object。

(注:上面提到的什麼『元件』之類的,是本書內才有的叫法,僅為了方便大家理解,官方並無此叫法。『元件』的正式叫法是『鍵值對』,又叫做『屬性值對』、『欄位值對』、『名稱值對』。其中,『鍵值對』的英文是『keyvaluepairs』)

這就是JSON的基礎語法,如果你能看懂上面的內容,那就恭喜你,接下來的內容對你來說將會相當簡單。

現在我們已經知道名稱叫做text的元件,是純文字內容元件。這個元件所輸出的內容是一串平平無奇的文字,沒有顏色,也沒有什麼特效。

如果我們想要給這串文字新增更多的特效,就要了解更多的元件及其使用方法。

在MinecraftJava的JSON文字中,可用的元件可以分為兩類:內容元件和修飾元件。內容元件用於規定每個JSON文字物件能夠表現出什麼樣的內容,一個JSON文字物件最多隻能有一個內容元件;修飾元件用於修飾內容元件,一個JSON文字物件可以擁有多個修飾元件來對輸出的內容進行修飾。

內容元件最基礎的是『text』,即上面接觸過的純文字內容元件。

使用純文字內容元件,可以顯示一串最簡單的JSON文字,就像上面的那個JSON文字:

“text““HelloMinecraft“

需要注意,JSON文字是對大小寫敏感的,因此你不能寫成如下的樣子:

“TEXT““HelloMinecraft“

那樣子會報錯。

上面顯示出來的HelloMinecraft是最基礎的白色。如果要更改文字顏色,那麼就需要使用color元件(在Java版,JSON文字很難使用分節符)。

color的值是字串,也就是說需要被引號包裹著。值支援17種顏色ID:

black(黑)、darkblue(深藍色)、darkgreen(深綠色)、darkaqua(深湖藍色)、darkred(深紅)、darkpurple(深紫)、gold(金色)、gray(灰色)、darkgray(深灰色)、blue(藍色)、green(綠色)、aqua(湖藍色)、red(紅色)、lightpurple(亮紫色)、yellow(黃色)、white(白色)和reset(取消顏色效果使用預設顏色,一般使用於子JSON物件中)

比如:

“text““HelloMinecraft“,“color““lightpurple“

就可以顯示一個淺紫色的“HelloMinecraft”。其中,color顏色元件修飾了text純文字內容元件的顏色為淺紫色。不難發現,如果有多個元件,就得使用英文半形逗號將它們分開。

如果你認為這些顏色還不夠,你甚至可以使用HTML的十六進位制顏色格式來搞到更多的顏色。比如紅色的十六位顏色編碼就是:ff0000,用到JSON文字里就是:

“text““HelloMinecraft“,“color““ff0000“

關於HTML十六位顏色編碼的具體內容自己上百度或谷歌搜,這兒就不多講了。

我們知道分節符§不僅可以更改文字顏色,還可以為文字新增更多的格式。那麼在JSON中,我們該如何為一串JSON文字新增格式呢?

§能新增五種文字格式,對應到JSON中即是:

§k亂碼對應obfuscated模糊文字

§l加粗對應bold粗體

§m刪除線對應strikethrough刪除線

§n下劃線對應underlined下劃線

§o斜體對應italic斜體

上面的五個元件其值型別均為布林值,也就是true(開啟)和false(關閉)。

在JSON文字中,布林值和gamerule一樣,是使用true和false,並且並不需要新增括號,因為不是字串。

比如要為HalloMinecraft新增斜體,你就需要這樣子:

“text““HelloMinecraft“,“italic“true

其中,italic斜體修飾元件修飾了text內容元件為斜體。你可以嘗試將italic改為其他元件,比如underlined、bold之類的。

現在我們已經瞭解了Java版JSON文字的基本使用方法,基本上日常使用是沒有什麼問題了。

不對,還有一個問題!如果要在一串JSON文字里前面使用一種顏色或文字格式,後面使用另一種顏色或文字格式,那該怎麼辦?

確實,使用花括號包裹的JSON文字,也就是JSON文字物件,就算修飾元件能夠含有多個,具體下來其實每個元件也只能包含一個,還沒有什麼先後順序。

那怎麼辦呢?能不能一次性就使用多個JSON文字物件呢?

答案是可以的。

我們可以將多個JSON文字物件排成一個陣列,組成一個JSON文字物件列表。

什麼是列表?顧名思義,就是將各種東西列在一起的表格。在JSON中,列表內的內容一般都是相同型別,比如都是小數,都是整數,都是字串,內容與內容之間用英文半形逗號分開,外側用中括號包裹起來,這樣子就形成了一個JSON列表。

比如下面就是一個全都是整數的JSON列表:

1,2,3,4,5,6

那既然列表內可以放數字,那能不能放字串、布林值,甚至是JSON物件呢?

答案也是可以的。

比如下面這樣子:

“text““Hello“,“color““blue“,“text““Minecraft“,“color““black“,“Launcher“

JSON文字在解析的時候,會按照我們正常人所認為的順序,即從左到右解析。這樣子就可以實現Hello是藍色,Minecraft是黑色,Launcher是藍色。

等等,為什麼Launcher是藍色而不是白色?

因為在一個JSON列表中,列表前面的JSON物件定義了文字顏色,這個顏色就會傳遞下去,就算中途有其他物件使用了color改變了其他顏色,也只是作用在這個物件內,下一個物件還是使用這個顏色。文字格式也是一樣的道理。

現在就沒什麼問題了吧?

需要注意一下,Java19版本之前的JSON,元件名不需要額外加括號,也就是說在MinecraftJava18版本,你可以直接這樣子:

text“HelloMinecraft“

JavaJSON歷史:

172——加入了tellraw,第一次有指令支援了JSON

18——加入了使用JSON的title。告示牌和成書也開始使用JSON文字。

113——自定義名稱使用了JSON文字。加入了name引數使用JSON的bossbar指令。

114——物品描述標籤支援JSON文字。

116——color可以使用HTML十六位顏色碼來更改文字顏色(需要注意這個功能是這時候才新增的)。

Asweknow,wecanttype§intothechatboxSocanwetypetheUnicodeof§intothechatbox

Theanswertothequestionisno

Socanwetypeitbyusingtellraw

Icansay,thewayisfeasibleinMinecraftJava1122

Now,letusrunMinecraftJava1122,andcreateanewworldincreativemodeRemembertoallowcheats

Aftertheworldwascreated,pleaserunthefollowingcommand

givescommandblock

ImsurethatyoumusthaveacommandblocknowPleasesetitontheground

RightclicktoopentheGUI,thenenterthefollowingcommand

tellrawp“text““u00a7bHelloMinecraft“

ClicktheDonebuttontoreturnthegameTakealeveroutofyourbagSetitnextthecommandblock

NowletspulltheleverThemomenttheleverispulled,alineoflightbluetextappearsurprisedlyYes,asyoulooked,wecanusetheUnicodeof§inJSONTextHaveyoulearnedit

Ifyouwanttolearnaboutitmore,pleasesearch“在原版中更改任意文字顏色“inMCBBSYouwillfindapostbyagreatcommandveteranin2015

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

爐石傳說:我的中二決鬥之旅 足球:王牌教練,從執教尤文開始 NBA:求求你們,讓我輸一把 絕地求生之最強指揮 長城守望:我攜武廟鎮守龍夏 網遊時代:每天上線一件特殊道具 我玩的可能是一個假遊戲