第十七章 java版json文本初识

在上一章提到了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文本听起来很高级,让人望而生畏,给人一种『作者似乎想要尝试教会你们』的样子,但其实它并不高级,相反还很简单。

简单到什么程度呢?看:

““zuqi.org 葡萄小说网

这是一串没有任何内容的简写json文本,如果将其识别,转化为正式的输出文本格式,那将会是一串空空如也的文本。

我们可以尝试向里面加入一些东西,比如:

“hello minecraft“

这串json文本被识别后,也就是运行『\/tellraw “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文本:

1这个json文本被一对花括号({})包围,这对花括号标志着这个json文本的开始和结束

2这个json文本内有两个内容,text和hello minecraft。这两个内容都是字符串,因此均被英文半角括号(““)所包裹着。一对英文半角括号标志着一个字符串的开始和结束。

3『“text“』是组件的名称(key),由于是字符串需要加上括号,所以其中的text才是具体的名称,意思为『文本』,标志着这个组件的值是一串要被显示出来的文本,也标志着这个组件是一个纯文本内容组件。

4『“hello minecraft“』是这个组件的值(value),由于它是一个字符串,因此要被括号包裹着,所以hello minecraft才是值的内容。这标志着这个纯文本内容组件将会显示出『hello minecraft』。

5『:』英文半角冒号是一对『组件名称』与『组件值』的分界线,其左边是名称,右边是值。

6『“text“:“hello minecraft“』像这样的由一对『名称』和『值』组成的东西,叫做『组件』(key-value pairs)。

7一个组件的名称规定了该组件是个什么东西,干什么用的。值则规定了该组件具体要干什么,怎么干。

8如果值或组件名是一个字符串(组件名肯定是),那就得使用括号将其包裹起来。

8外面被花括号所包裹着的,里面有一个或多个组件的东西,就像『{“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:

ck(黑)、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列表:

[1,2,3,4,5,6]

那既然列表内可以放数字,那能不能放字符串、布尔值,甚至是json对象呢?

答案也是可以的。

比如下面这样子:

[{“text“:“hello“,“color“:“blue“},{“text“:“minecraft“,“color“:“ck“},uncher“]

json文本在解析的时候,会按照我们正常人所认为的顺序,即从左到右解析。这样子就可以实现hello是蓝色,minecraft是黑色uncher是蓝色。

等等,为什uncher是蓝色而不是白色?

因为在一个json列表中,列表前面的json对象定义了文本颜色,这个颜色就会传递下去,就算中途有其他对象使用了color改变了其他颜色,也只是作用在这个对象内,下一个对象还是使用这个颜色。文本格式也是一样的道理。

现在就没什么问题了吧?

需要注意一下,版本之前的json,组件名不需要额外加括号,也就是说在minecraf版本,你可以直接这样子:

{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 type § into th 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 creativ to allow cheats.

after the world was created ,please run the following mand:

\/give mand_block

i''m sure that you must have a mand bloc set it on the ground.

right click to open the gui,then enter the following mand:

\/tellraw {“text“:“\\u00a7bhello minecraft“}

click the done button to return th a lever out of you it next the mand block.

now let''s pull th 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 “在原版中更改任意文字颜色“ i will find a post by a great mand veteran in 2015.

上一章目录+书架下一章