分项与数组
extra-分项 以及 JSON array-JSON数组 提供了让多个不同的文本对象同时存在的可能性
例如想让一条tellraw
命令中使用多个不同样式的文本对象,或者是组合多个JSON结构时使用
同时它们在告示牌和成书之中也有重要的角色
并且继承的特性有时能让一些样式上的设定变得方便
基础
extra-分项是一个附加在JSON文本中的数组对象
其格式为
extra:[{<JSON文本1>},{<JSON文本2>},......]
JSON文本1、JSON文本2...等等的文本对象会被放在当前对象之后。
而JSON array则是由[]
包围的JSON文本,在需求JSON文本的命令/NBT中,可以直接使用[]
输入一个JSON数组,取代使用{}
来输入单一对象
使用一个简单的例子:
tellraw @a {"text":"Hello World"}
最基础的一条tellraw
命令也可以分别以extra
和array
的形式重写
array:
tellraw @a [{"text":"Hello"},{"text":" World"}]
或者
tellraw @a ["Hello"," World"]
(在array中,可以用双引号直接取代简单的text
对象,可以和完整的JSON文本混合使用)
extra:
tellraw @a {"text":"Hello","extra":[{"text":" World"}]}
三者效果是完全一样的
extra内也可以添加多个JSON文本
例如:
tellraw @a {"text":"Hello","extra":[{"text":" Minecraft"},{"text":" World"}]}
不过由于extra
和array
的效果和特性基本一致,出于array
比extra
使用上方便一点,以及格式上比较方便阅读和美观,个人推荐尽量使用array
。
然而在进度里,文件只能够使用Compound,因此只能使用extra。
应用
extra及array最大的应用,就是可以分别设置每一个JSON文本的属性
例如:
array:
tellraw @a [{"text":"Hello","color":"red"},{"text":" Minecraft","color":"green"},{"text":" World","color":"blue"}]
extra:
tellraw @a {"text":"Hello","color":"red","extra":[{"text":" Minecraft","color":"green"},{"text":" World","color":"blue"}]}
不仅仅是颜色之类的样式代码,还可以是CE(clickEvent)和HE(hoverEvent)
例如:
array:
tellraw @a [{"text":"Hello","color":"red"},{"text":" Minecraft","color":"green","clickEvent":{"action":"run_command","value":"/say Minecraft"}},{"text":" World","color":"blue","hoverEvent":{"action":"show_text","value":"World"}}]
extra:
tellraw @a {"text":"Hello","color":"red","extra":[{"text":" Minecraft","color":"green","clickEvent":{"action":"run_command","value":"/say Minecraft"}},{"text":" World","color":"blue","hoverEvent":{"action":"show_text","value":"World"}}]}
由于命令比较长,下面将会把命令分解出来说明
这条/tellraw
命令分别有3个JSON文本:
第一个JSON文本(array内首个对象,或者是带有extra列表的那个对象),我们可称之为主项:
{"text":"Hello","color":red}
其设定为红色的"Hello"
第二个对象:
{"text":" Minecraft","color":"green","clickEvent":{"action":"run_command","value":"/say Minecraft"}}
其设定为绿色的" Minecraft",点击执行/say Minecraft
第三个对象:
{"text":" World","color":"blue","hoverEvent":{"action":"show_text","value":"World"}}
其设定为蓝色的" World",悬浮时显示"World"
效果就会是:
不仅如此,它们还可以设置不同结构的JSON(例如组合text,score和selector)
例如:
array:
tellraw @a [{"text":"Nearest Player:"},{"selector":"@p"}]
extra:
tellraw @a {"text":"Nearest Player:","extra":[{"selector":"@p"}]}
这里有两个对象:
主项的文本:"Nearest Player:"
和第二项的
@p
选择符
效果就是:
继承
extra
和array
都拥有继承的特性
所有分项
(array里面首个之后的对象/extra列表里面的所有对象)都会继承到主项
(array里面首个对象/带有extra列表的那个对象)的设定
举个例子帮助理解:
array:
tellraw @a [{"text":"Hello","bold":true},{"text":" World"}]
extra:
tellraw @a {"text":"Hello","bold":true,"extra":[{"text":" World"}]}
在本例中,只有主项设置了bold
属性,但是由于继承的特性,分项也同时拥有了粗体的样式
但是反之,分项的设定并不会影响主项,例如:
array:
tellraw @a [{"text":"Hello"},{"text":" World","bold":true}]
extra:
tellraw @a {"text":"Hello","bold":true,"extra":[{"text":" World","bold":true}]}
同时,分项之间并不会互相影响,并且继承而来的属性可以被覆盖
例如:
array:
tellraw @a [{"text":"Hello","bold":true},{"text":" Minecraft","color":"green"},{"text":" World","bold":false}]
extra:
tellraw @a {"text":"Hello","bold":true,"extra":[{"text":" Minecraft","color":"green"},{"text":" World","bold":false}]}
详细分析一下以上的命令,以上的/tellraw
拥有三个对象
主项为"Hello",拥有
bold
属性第二项" Minecraft",继承了
bold
属性,并且设定了颜色为绿色第三项" World",虽然应该继承主项的
bold
属性,但是bold:false
设定覆盖了继承而来的属性,同时也不受第二项的颜色属性影响
虽然本节没有使用CE/HE作为例子,但它们也是可以如同样式代码
一样被继承的,规则相同。但如果子对象也有设置CE/HE,继承下来的事件会被取代。
如果有时需要设定一段格式差异较大的JSON文本,例如只想将第一段文字设定为粗体,其他都不要,那么后面的文本是不是都要设定bold:false
这么麻烦?
一个方便的做法为,将主项设置为空项,例如:
array:
tellraw @a ["",{"text":"Hello","bold":true},{"text":" Minecraft","color":"green"},{"text":" World","italic":true}]
extra:
tellraw @a {"text":"","extra":[{"text":"Hello","bold":true},{"text":" Minecraft","color":"green"},{"text":" World","italic":true}]}
这样即可确保每一个JSON文本的独立性,减少互相干扰