第十七章 Java版JSON文本初识
在上一章提到了JSON文本。JSON文本在学习指令前期估计只有/title和/tellraw会用到,所以我们这边也就先认识一下如何使用JSON文本显示文本内容。
JSON /ˈdʒeɪsən/,全称JavaScribr /t Object Notation,是一种轻量级资料交换格式。而我们今天所要了解的,叫做JSON文本(JSON Text)。更确切的来说,是原始JSON文本(Raw JSON Text)。
需要注意,JSON≠JSON文本≠原始JSON文本。JSON有很多用途,不仅仅是拿来给你发消息用的。JSON文本严格来说指的是原始JSON文本经过识别所转化成我们人能够看得懂的文本,没有带JSON语法的那种,也就是最终的输出形式。原始JSON文本既然带有『原始』二字,那就是指还未经过识别的JSON文本,也就是还处于原始形态并带有JSON语法的JSON文本。
在Minecraft中,Java版和基岩版的JSON文本略有差别,但大体都相同。本章主要讲的是Java版的原始JSON文本的使用,因为在基岩版,原始JSON文本在指令中使用程度并不高。我们会在第六十章讲到基岩版的JSON文本。
如果你还没搞懂,也没关系,看下去就完事了。
原始JSON文本听起来很高级,让人望而生畏,给人一种『作者似乎想要尝试教会你们』的样子,但其实它并不高级,相反还很简单。
简单到什么程度呢?看:
““
这是一串没有任何内容的简写JSON文本,如果将其识别,转化为正式的输出文本格式,那将会是一串空空如也的文本。
我们可以尝试向里面加入一些东西,比如:
“Hello Minecraft“
这串JSON文本被识别后,也就是运行『/tellraw @a “Hello Minecraft“』,将会输出如下内容:
Hello Minecraft
(注意,JSON文本的所有括号均为英文半角括号,但阅文平台会自动将英文半角括号改为中文全角括号,所以会有些奇怪)
是不是很简单?但你有没有注意到,上面我提到『这是一串没有任何内容的简写JSON文本』,注意『简写』两字。
所以它的真正形态是什么呢?如下:
{“text“:“Hello Minecraft“}
别害怕,这仍然很简单。
上面这就是刚才那个『“Hello Minecraft“』的真正形态。我们对这个完全体进行解剖,可以得到如下内容:
{——一个花括号,这个花括号告诉游戏『嘿,这里是JSON文本的开始!』。游戏也根据它的形态,判断出接下来将是一个JSON对象。
“——一个英文半角括号,这个括号告诉游戏『这里是一个字符串的开始!』
text ——一串英文。游戏暂且不知道这串英文的意思,于是它继续看下去。
“——又是一个英文半角括号,这个括号告诉游戏『这里是这个字符串的结束!』
:——一个英文半角冒号,这个冒号告诉游戏『这里是这个组件(key-value br /airs)的名称与值的界限!』。游戏根据以往的经验,确认刚刚遇见的『“text“』是这个组件的名称(key),这个组件是一个text纯文本内容组件。
“——还是一个英文半角括号,这个括号告诉游戏『这里是又一个字符串的开始!』
Hello Minecraft ——一串内容,游戏根据前面得到的消息,确认这是这个组件的值(value)。游戏因此得知,这个text纯文本内容组件将会显示出『Hello Minecraft』。
“——最后一个英文半角括号,这个括号告诉游戏『这里是这个字符串的结束!』
}——又一个花括号,这个花括号告诉游戏『这里是JSON文本的结束!』
然后游戏根据以上信息,确认这个原始JSON文本的意思是:显示出一串文本(text),内容为『Hello Minecraft』
我们也可以根据以上信息,了解了这个JSON文本:
①这个JSON文本被一对花括号({})包围,这对花括号标志着这个JSON文本的开始和结束
②这个JSON文本内有两个内容,text和Hello Minecraft。这两个内容都是字符串,因此均被英文半角括号(““)所包裹着。一对英文半角括号标志着一个字符串的开始和结束。
③『“text“』是组件的名称(key),由于是字符串需要加上括号,所以其中的text才是具体的名称,意思为『文本』,标志着这个组件的值是一串要被显示出来的文本,也标志着这个组件是一个纯文本内容组件。
④『“Hello Minecraft“』是这个组件的值(value),由于它是一个字符串,因此要被括号包裹着,所以Hello Minecraft才是值的内容。这标志着这个纯文本内容组件将会显示出『Hello Minecraft』。
⑤『:』英文半角冒号是一对『组件名称』与『组件值』的分界线,其左边是名称,右边是值。
⑥『“text“:“Hello Minecraft“』像这样的由一对『名称』和『值』组成的东西,叫做『组件』(key-value br /airs)。
⑦一个组件的名称规定了该组件是个什么东西,干什么用的。值则规定了该组件具体要干什么,怎么干。
⑧如果值或组件名是一个字符串(组件名肯定是),那就得使用括号将其包裹起来。
⑧外面被花括号所包裹着的,里面有一个或多个组件的东西,就像『{“text“:“Hello Minecraft“}』这样的,是一个JSON对象(Object)。
(注:上面提到的什么『组件』之类的,是本书内才有的叫法,仅为了方便大家理解,官方并无此叫法。『组件』的正式叫法是『键-值对』,又叫做『属性-值对』、『栏位-值对』、『名称-值对』。其中,『键-值对』的英文是『key-value br /airs』)
这就是JSON的基础语法,如果你能看懂上面的内容,那就恭喜你,接下来的内容对你来说将会相当简单。
现在我们已经知道名称叫做text的组件,是纯文本内容组件。这个组件所输出的内容是一串平平无奇的文字,没有颜色,也没有什么特效。
如果我们想要给这串文字添加更多的特效,就要了解更多的组件及其使用方法。
在Minecraft Java的JSON文本中,可用的组件可以分为两类:内容组件和修饰组件。内容组件用于规定每个JSON文本对象能够表现出什么样的内容,一个JSON文本对象最多只能有一个内容组件;修饰组件用于修饰内容组件,一个JSON文本对象可以拥有多个修饰组件来对输出的内容进行修饰。
内容组件最基础的是『text』,即上面接触过的纯文本内容组件。
使用纯文本内容组件,可以显示一串最简单的JSON文本,就像上面的那个JSON文本:
{“text“:“Hello Minecraft“}
需要注意,JSON文本是对大小写敏感的,因此你不能写成如下的样子:
{“TEXT“:“Hello Minecraft“}
那样子会报错。
上面显示出来的Hello Minecraft是最基础的白色。如果要更改文字颜色,那么就需要使用color组件(在Java版,JSON文本很难使用分节符)。
color的值是字符串,也就是说需要被引号包裹着。值支持17种颜色ID:
black(黑)、dark_blue(深蓝色)、dark_green(深绿色)、dark_aqua(深湖蓝色)、dark_red(深红)、dark_br /urbr /le(深紫)、gold(金色)、gray(灰色)、dark_gray(深灰色)、blue(蓝色)、green(绿色)、aqua(湖蓝色)、red(红色)、light_br /urbr /le(亮紫色)、yellow(黄色)、white(白色)和reset(取消颜色效果使用默认颜色,一般使用于子JSON对象中)
比如:
{“text“:“Hello Minecraft“,“color“:“light_br /urbr /le“}
就可以显示一个浅紫色的“Hello Minecraft”。其中,color颜色组件修饰了text纯文本内容组件的颜色为浅紫色。不难发现,如果有多个组件,就得使用英文半角逗号将它们分开。
如果你认为这些颜色还不够,你甚至可以使用HTML的十六进制颜色格式来搞到更多的颜色。比如红色的十六位颜色编码就是:#ff0000,用到JSON文本里就是:
{“text“:“Hello Minecraft“,“color“:“#ff0000“}
关于HTML十六位颜色编码的具体内容自己上百度或谷歌搜,这儿就不多讲了。
我们知道分节符§不仅可以更改文本颜色,还可以为文本添加更多的格式。那么在JSON中,我们该如何为一串JSON文本添加格式呢?
§能添加五种文本格式,对应到JSON中即是:
§k 乱码对应obfuscated模糊文本
§l 加粗对应bold粗体
§m 删除线对应strikethrough删除线
§n 下划线对应underlined下划线
§o 斜体对应italic斜体
上面的五个组件其值类型均为布尔值,也就是true(开启)和false(关闭)。
在JSON文本中,布尔值和gamerule一样,是使用true和false,并且并不需要添加括号,因为不是字符串。
比如要为Hallo Minecraft添加斜体,你就需要这样子:
{“text“:“Hello Minecraft“,“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改变了其他颜色,也只是作用在这个对象内,下一个对象还是使用这个颜色。文本格式也是一样的道理。
现在就没什么问题了吧?
需要注意一下,Java1.9版本之前的JSON,组件名不需要额外加括号,也就是说在Minecraft Java1.8版本,你可以直接这样子:
{text:“Hello Minecraft“}
Java JSON历史:
1.7.2——加入了/tellraw,第一次有指令支持了JSON
1.8——加入了使用JSON的/title。告示牌和成书也开始使用JSON文本。
1.13——自定义名称使用了JSON文本。加入了name参数使用JSON的/bossbar指令。
1.14——物品描述标签支持JSON文本。
1.16——color可以使用HTML十六位颜色码来更改文本颜色(需要注意这个功能是这时候才添加的)。
......
......
......
As we know ,we can't tybr /e § into the chatbox. So can we tybr /e the Unicode of § into the chatbox?
The answer to the question is no.
So can we tybr /e 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 ,br /lease 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 obr /en the GUI,then enter the following command:
/tellraw @br / {“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 br /ull the lever.The moment the lever is br /ulled, a line of light blue text abr /br /ear surbr /risedly! 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, br /lease search “在原版中更改任意文字颜色“ in MCBBS.You will find a br /ost by a great command veteran in 2015.