第十七章 Java版JSON文本初识
2020年1月6日 17:57 3920字
在上一章提到了 JSON 文本。JSON 文本在学习指令前期估计只有 /title 和 /tellraw 会用到,所以我们这边也就先认识一下如何使用 JSON 文本显示文本内容。
JSON /ˈdʒeɪsən/,全称 JavaScript 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 文本,如果将其识别,转化为正式的输出文本格式,那将会是一串空空如也的文本。
我们可以尝试向里面加入一些东西,比如:
这串 JSON 文本被识别后,也就是运行『/tellraw @a "Hello Minecraft"』,将会输出如下内容:
Hello Minecraft
(注意,JSON 文本的所有括号均为英文半角括号,但阅文平台会自动将英文半角括号改为中文全角括号,所以会有些奇怪)
是不是很简单?但你有没有注意到,上面我提到『这是一串没有任何内容的简写 JSON 文本』,注意『简写』两字。
所以它的真正形态是什么呢?如下:
- {"text":"Hello Minecraft"}
复制代码
别害怕,这仍然很简单。
上面这就是刚才那个『"Hello Minecraft"』的真正形态。我们对这个完全体进行解剖,可以得到如下内容:
- { —— 一个花括号,这个花括号告诉游戏『嘿,这里是 JSON 文本的开始!』。游戏也根据它的形态,判断出接下来将是一个 JSON 对象。
- " —— 一个英文半角括号,这个括号告诉游戏『这里是一个字符串的开始!』
- text —— 一串英文。游戏暂且不知道这串英文的意思,于是它继续看下去。
- " —— 又是一个英文半角括号,这个括号告诉游戏『这里是这个字符串的结束!』
- : —— 一个英文半角冒号,这个冒号告诉游戏『这里是这个组件 (key-value pairs) 的名称与值的界限!』。游戏根据以往的经验,确认刚刚遇见的『"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 pairs)。
- 一个组件的名称规定了该组件是个什么东西,干什么用的。值则规定了该组件具体要干什么,怎么干。
- 如果值或组件名是一个字符串(组件名肯定是),那就得使用括号将其包裹起来。
- 外面被花括号所包裹着的,里面有一个或多个组件的东西,就像『{"text":"Hello Minecraft"}』这样的,是一个 JSON对象 (Object)。
(注:上面提到的什么『组件』之类的,是本书内才有的叫法,仅为了方便大家理解,官方并无此叫法。『组件』的正式叫法是『键-值对』,又叫做『属性-值对』、『栏位-值对』、『名称-值对』。其中,『键-值对』的英文是『key-value pairs』)
这就是 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_purple(深紫)、gold(金色)、gray(灰色)、dark_gray(深灰色)、blue(蓝色)、green(绿色)、aqua(湖蓝色)、red(红色)、light_purple(亮紫色)、yellow(黄色)、white(白色)和 reset(取消颜色效果使用默认颜色,一般使用于子 JSON 对象中)
比如:
{"text":"Hello Minecraft","color":"light_purple"}
就可以显示一个浅紫色的“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 列表:
那既然列表内可以放数字,那能不能放字符串、布尔值,甚至是 JSON 对象呢?
答案也是可以的。
比如下面这样子:
[{"text":"Hello","color":"blue"},{"text":"Minecraft","color":"black"},"Launcher"]
JSON 文本在解析的时候,会按照我们正常人所认为的顺序,即从左到右解析。这样子就可以实现 Hello 是蓝色,Minecraft 是黑色,Launcher 是蓝色。
等等,为什么 Launcher 是蓝色而不是白色?
因为在一个 JSON 列表中,列表前面的 JSON 对象定义了文本颜色,这个颜色就会传递下去,就算中途有其他对象使用了 color 改变了其他颜色,也只是作用在这个对象内,下一个对象还是使用这个颜色。文本格式也是一样的道理。
现在就没什么问题了吧?
需要注意一下,Java1.9 版本之前的 JSON,组件名不需要额外加括号,也就是说在 Minecraft Java1.8 版本,你可以直接这样子:
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 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:
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.PS: You cannot find it anymore because MCBBS is dead.
|
|