企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 分项与数组 **extra-分项** 以及 **JSON array-JSON数组** 提供了让多个不同的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"} ``` ![1](https://box.kancloud.cn/1b5b72c53fb3af46db42fe8a2d1d613e_648x18.png) 最基础的一条`tellraw`命令也可以分别以`extra`和`array`的形式重写 array: ``` /tellraw @a [{"text":"Hello"},{"text":" World"}] ``` 或者 ``` /tellraw @a ["Hello"," World"] ``` (在array中,可以用双引号直接取代简单的`text`对象,可以和完整的JSON文本混合使用) ![1](https://box.kancloud.cn/1b5b72c53fb3af46db42fe8a2d1d613e_648x18.png) extra: ``` /tellraw @a {"text":"Hello","extra":[{"text":" World"}]} ``` ![1](https://box.kancloud.cn/1b5b72c53fb3af46db42fe8a2d1d613e_648x18.png) 三者效果是完全一样的 --- extra内也可以添加多个JSON文本 例如: ``` /tellraw @a {"text":"Hello","extra":[{"text":" Minecraft"},{"text":" World"}]} ``` ![41](https://box.kancloud.cn/6981dfe3fa22128f408ff2f0483626ea_648x18.png) --- 不过由于`extra`和`array`的效果和特性基本一致,出于`array`比`extra`使用上方便一点,以及格式上比较方便阅读和美观,个人推荐尽量使用`array` ## 应用 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"}]} ``` ![42](https://box.kancloud.cn/a407dd384412b4572ae5aaaf976547ee_648x18.png) 不仅仅是颜色之类的样式代码,还可以是CE和HE 例如: 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" 效果就会是: ![43](https://box.kancloud.cn/831d38aaf8be218c963e6b98ca889692_648x59.png) --- 不仅如此,它们还可以设置不同结构的JSON(例如组合text,score和selector) 例如: array: ``` /tellraw @a [{"text":"Nearest Player:"},{"selector":"@p"}] ``` extra: ``` /tellraw @a {"text":"Nearest Player:","extra":[{"selector":"@p"}]} ``` 这里有两个对象: - 主项的文本:**"Nearest Player:"** - 和第二项的`@p`选择符 效果就是: ![44](https://box.kancloud.cn/d911cc3f37271fde499362837cf34cda_648x19.png) ## 继承 `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"}]} ``` ![45](https://box.kancloud.cn/c3720339a59caf9fea9340c7a9d49ff6_648x18.png) 在本例中,只有主项设置了`bold`属性,但是由于继承的特性,分项也同时拥有了粗体的样式 但是反之,分项的设定并不会影响主项,例如: array: ``` /tellraw @a [{"text":"Hello"},{"text":" World","bold":true}] ``` extra: ``` /tellraw @a {"text":"Hello","bold":true,"extra":[{"text":" World","bold":true}]} ``` ![46](https://box.kancloud.cn/aa0dd90ed6c4c02f300431f8d69eab6d_648x18.png) 同时,分项之间并不会互相影响,并且继承而来的属性可以被覆盖 例如: 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}]} ``` ![47](https://box.kancloud.cn/2f4cf57ac60017fd8a4508c220bd5681_648x18.png) 详细分析一下以上的命令,以上的`/tellraw`拥有三个对象 - 主项为"Hello",拥有`bold`属性 - 第二项" Minecraft",继承了`bold`属性,并且设定了颜色为绿色 - 第三项" World",虽然应该继承主项的`bold`属性,但是`bold:false`设定覆盖了继承而来的属性,同时也不受第二项的颜色属性影响 虽然本节没有使用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}]} ``` ![48](https://box.kancloud.cn/8691917e4aa0e2f8ad9b44797fa65231_648x18.png) 这样即可确保每一个JSON文本的独立性,减少互相干扰