# 分项与数组
**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文本的独立性,减少互相干扰