原始JSON文本(Raw JSON text)是指在Minecraft中使用JSON语言表示的文本。
本文章将介绍原始JSON文本的格式,阅读本教程时应该要对JSON的语法和用法有一定的了解。
从数据类型上讲,一个原始JSON文本一般是字符串、对象(object,也叫组合)及列表。
用途
Minecraft的几乎各处都使用了原始JSON文本。
你在告示牌、书与笔中书写一些文字,这些文字一般都是纯文本。但是从技术上讲,这些文字实际上是原始JSON文本,对其数据稍加修改就可以让文字不再是简单的纯文本。
通过铁砧给物品或者实体命名,这个名字实际上也是原始JSON文本,修改其数据即可使物品或实体的名字带有格式。
进度的名称和描述也使用了原始JSON文本,它使用了翻译标识符。如果修改你的游戏语言,进度的名称和描述也将随之改变,这是由于它是由原始JSON文本定义了翻译标识符,然后对应到游戏资源文件相应语言的相应内容。通过修改原始JSON文本,我们也可以让告示牌、物品或实体的名称、书的内容也能够随游戏语言而变化。
可见,原始JSON文本在游戏内非常普遍。要用命令修改实体的名称、告示牌或书的内容,或者设置记分板项或boss栏的名称,你可以直接输入字符串。但如果你想让其拥有更多样式的话,便必须要有一点关于原始JSON文本的知识。
使用字符串
将文本内容两段加上双引号(注意是英文的半角双引号),即可形成一个字符串:
"Welcome to Minecraft!"
它就是一个单独的 字符串。这个原始JSON文本的效果如下:
Welcome to Minecraft!
一般地,如果你只是为了自定义文本且没有其他需求,你可以直接写成字符串的形式。
原始JSON文本元素介绍
为了使原始JSON文本具有多样性,你可以将其写成一个对象,并在里面使用元素。以下介绍了所有可用的原始JSON文本元素。
纯文本:text
纯文本可以说是最简单、最基础的原始JSON文本元素了。
在对象中,你可以使用 text来显示特定的文本:
{
"text":"Welcome to Minecraft!"
}
效果:
Welcome to Minecraft!
如果只有 text元素,那么其和字符串的效果是等价的。
值得注意的是,如果文本里出现了“"”或“\”,那么便需要在这些字符的前面加上反斜杠“\”来对其进行转义。其他转义字符在原始JSON文本里也是支持的。
对文本进行装饰
有时候我们要将文本渲染成特定的颜色,或者应用的特定格式。这时候以下元素便可以帮助我们渲染文本。
为文本添加颜色:color
color用于指定对象内文本的颜色,其值通常为颜色名称。下面的实例会将“Welcome to Minecraft”渲染为深红色:
{
"text":"Welcome to Minecraft!",
"color":"dark_red"
}
效果:
Welcome to Minecraft!
以下为所有支持的值。将格式作为值在这里是可用的,但建议使用下文的布尔值实现。
值 | 名称 | 前景色 | 背景色 | ||||||
---|---|---|---|---|---|---|---|---|---|
R | G | B | Hex | R | G | B | Hex | ||
black | 黑色 | 0 | 0 | 0 | 000000 | 0 | 0 | 0 | 000000 |
dark_blue | 深蓝色 | 0 | 0 | 170 | 0000AA | 0 | 0 | 42 | 00002A |
dark_green | 深绿色 | 0 | 170 | 0 | 00AA00 | 0 | 42 | 0 | 002A00 |
dark_aqua | 湖蓝色 | 0 | 170 | 170 | 00AAAA | 0 | 42 | 42 | 002A2A |
dark_red | 深红色 | 170 | 0 | 0 | AA0000 | 42 | 0 | 0 | 2A0000 |
dark_purple | 紫色 | 170 | 0 | 170 | AA00AA | 42 | 0 | 42 | 2A002A |
gold | 金色 | 255 | 170 | 0 | FFAA00 | 42 | 42 | 0 | 2A2A00 |
gray | 灰色 | 170 | 170 | 170 | AAAAAA | 42 | 42 | 42 | 2A2A2A |
dark_gray | 深灰色 | 85 | 85 | 85 | 555555 | 21 | 21 | 21 | 151515 |
blue | 蓝色 | 85 | 85 | 255 | 5555FF | 21 | 21 | 63 | 15153F |
green | 绿色 | 85 | 255 | 85 | 55FF55 | 21 | 63 | 21 | 153F15 |
aqua | 天蓝色 | 85 | 255 | 255 | 55FFFF | 21 | 63 | 63 | 153F3F |
red | 红色 | 255 | 85 | 85 | FF5555 | 63 | 21 | 21 | 3F1515 |
light_purple | 粉红色 | 255 | 85 | 255 | FF55FF | 63 | 21 | 63 | 3F153F |
yellow | 黄色 | 255 | 255 | 85 | FFFF55 | 63 | 63 | 21 | 3F3F15 |
white | 白色 | 255 | 255 | 255 | FFFFFF | 63 | 63 | 63 | 3F3F3F |
bold | 粗体 | N/A | |||||||
italic | 斜体 | ||||||||
underlined | 下划线 | ||||||||
strikethrough | 删除线 | ||||||||
obfuscated | 随机字符 |
为文本添加格式:bold、italic、underlined、strikethrough和obfuscated
bold、 italic、 underlined、 strikethrough和 obfuscated可以将文本设置为特定的格式。这些元素都是布尔值。
这些元素可以放在一起使用,这样这些格式将会叠加在一起。
下面的对象将会为文字设置加粗和倾斜效果:
{
"text":"The text with bold and italic",
"bold":true,
"italic":true
}
效果:
The text with bold and italic
obfuscated本质上和其他添加格式的元素相同,但它将会把文本变为会一直变化的随机字符。游戏只会选择与原文本等宽的字符作为其随机字符。
如果这些元素的值被设为“false”,那么它将不会应用该格式;如果父对象使用了该格式,那么这个对象将不会使用该格式。
显示不同形式的文本
有时候我们不希望它显示纯文本,这时候我们可以使用别的文本显示元素。它们最终会输出为文本,输出的内容视元素及输入的值决定。一个对象内必须要含有一个文本显示元素。
翻译标识符:translate
translate用于在不同的语言下显示不同文本,其值为一个翻译标识符。
下面的对象将会显示石头的名称:
{
"translate":"block.minecraft.stone"
}
在简体中文里,它会显示为石头
,但如果将游戏语言切换为英语,这个对象又会显示为stone
。游戏里所有需要显示文本的地方都使用了翻译标识符。
如果翻译标识符在所选语言里没有对应值,它将使用en_us.json里该翻译标识符的值。如果该翻译标识符无法在任何语言文件里被找到,游戏会直接输出翻译标识符。
如果要添加翻译标识符,则需要使用资源包。
为标识符中的参数赋值:with
有些翻译标识符会使用像“%s”和“%n$s”这样的参数来表示变量。直接使用 translate时,这些参数会被忽略。想要让参数也显示为特定的文本,就需要使用元素 with。
with是一个列表,列表中的每一个元素都应该是原始JSON文本对象。列表内的元素将会这样分配给每个参数:
- 对于“%s”而言,第一个“%s”会使用列表中的第一个元素,而下一个“%s”将会接着使用第二个元素,依次类推,直至不再出现“%s”。
- 对于“%n$s”而言,其将会直接使用列表中的第n个元素。
我们用一个例子来说明这一切。
“translation.test.complex”是用于测试的翻译标识符,其在zh_cn.json里的原始值如下:
前缀,%s%2$s 然后是 %s 和 %1$s 最后是 %s 还有 %1$s!
如果只使用 translate元素,它看起来是这样的:
前缀, 然后是 和 最后是 还有 !
现在,我们用 with来给这些参数赋值:
{
"translate":"translation.test.complex",
"with":[
"a",
{"text":"b"},
{"text":"c","color":"dark_red"}
]
}
它看起来是这个样子的:
前缀,ab 然后是 b 和 a 最后是 c 还有 a!
原始值中的“%1$s”和“%2$s”都分别对应了第一个元素"a"
和第二个元素{"text":"b"}
,而其中的“%s”按照从前往后的顺序分别被赋予了"a"
、{"text":"b"}
和{"text":"c","color":"dark_red"}
。
记分板分数:score
score可以用于显示指定实体的记分项的分数。该元素是一个复合标签,值应该用花括号括起。
花括号内必须要有参数 name和 objective。 name是要显示分数的实体,其值可以为玩家名、实体选择器或“*”(选择阅读这段原始JSON文本的实体)。 objective是对应的记分项名。
{
"score":{
"name":"Jim",
"objective":"dummy"
}
}
这会显示Jim在记分项dummy上的分数。Jim并不一定需要在线,甚至不一定需要存在。如果Jim在dummy上没有分数,那么将什么都不会显示。
如果加入参数 value,那么无论记分板的分数如何,其都会显示 value的值。值得注意的是该参数是一个字符串,这意味着其可以显示为其他字符而不必是整数。
{
"score":{
"name":"Jim",
"objective":"dummy",
"value":"7"
}
}
无论Jim在记分项dummy上的分数是多少,其永远只会显示“7”。
实体选择器:selector
selector会显示所有被选中的实体的名称。其值为一个实体选择器。
下面的对象将会显示所有苦力怕的名称:
{
"selector":"@e[type=creeper]"
}
如果选择到了多个实体,那么它将会以“实体A, 实体B, 实体C”的形式列举。
使用这种方法输出的文本可以通过⇧ Shift+左键获取对应实体的UUID。
按键键位:keybind
keybind用于显示对应功能的按键,其可以因玩家的设定偏好而改变。
下面的对象将会显示代表打开物品栏的键位:
{
"keybind":"key.inventory"
}
如果没有改变打开物品栏的键位,那么它将会显示默认键位E。但如果更改了键位,那么它会显示为改变后的打开物品栏的键位。
以下表格展示了所有可用值:
游戏内分类 | 值 | 游戏内描述 | 默认键位 |
---|---|---|---|
移动 | key.forward | 向前移动 | W |
key.left | 向左移动 | A | |
key.right | 向右移动 | D | |
key.back | 向后移动 | S | |
key.sneak | 潜行 | 左⇧ Shift | |
key.sprint | 疾跑 | 左ctrl | |
key.jump | 跳跃 | space | |
游戏内容 | key.use | 使用物品/放置方块 | 鼠标右键 |
key.attack | 攻击/摧毁 | 鼠标左键 | |
key.pickItem | 选取方块 | 鼠标中键 | |
物品栏 | key.drop | 丢弃所选物品 | Q |
key.swapHands | 交换手中的物品 | F | |
key.inventory | 开启/关闭物品栏 | E | |
key.hotbar.[1-9] | 快捷栏[1-9] | 1-9 | |
创造模式 | key.saveToolbarActivator | 保存物品工具栏 | C |
key.loadToolbarActivator | 加载物品工具栏 | X | |
多人游戏 | key.chat | 打开聊天栏 | T |
key.playerlist | 玩家列表 | Tab ↹ | |
key.command | 输入命令 | / | |
杂项 | key.fullscreen | 全屏显示切换 | F11 |
key.smoothCamera | 切换电影视角 | ||
key.togglePerspective | 切换视角 | F5 | |
key.screenshot | 截图 | F2 | |
key.advancements | 进度 | L | |
key.spectatorOutlines | 高亮玩家(旁观者) |
NBT标签的值:nbt
nbt用于获取方块、实体或命令存储的NBT标签的值,其以NBT路径的形式书写。
block、 entity和 storage用于指定要获取标签的方块、实体或命令存储。
block的值是一组方块坐标,以“<x> <y> <z>”的形式书写。其可以使用相对坐标,这时以生成文本的位置为基准点。
下面的对象将会显示执行者下面的方块的“Items”标签的值:
{
"nbt":"Items",
"block":"~ ~-1 ~"
}
entity的值是目标选择器。如果选择到了多个实体,那么获取的值将会依次列举。
下面的对象将会显示最近玩家的“Health”标签的值:
{
"nbt":"Health",
"entity":"@p"
}
storage的值是命名空间ID。
下面的对象将会显示存储test:a
中“a”标签的值:
{
"nbt":"a",
"storage":"test:a"
}
block、 entity和 storage只能使用其中的一个。若存在多个,则按以下优先级选择最终要使用的元素:
block > entity > storage
将获取的值解析为原始JSON文本:interpret
interpret是一个布尔值。当其为“true”时,由 nbt获取的值将会解析为原始JSON文本并显示。
假设在147 78 48处有一个白桦木告示牌,其“Text1”的值如下:
'{"italic":true,"color":"dark_red","text":"I am a happy sign XD"}'
如果直接使用 nbt获取标签的值,结果会直接输出为字符串,不会进行任何解析:
{"italic":true,"color":"dark_red","text":"I am a happy sign XD"}
但如果加入 interpret元素并将其设为“true”:
{
"nbt":"Text1",
"block":"147 78 48",
"interpret":true
}
这会将获取到的值继续以原始JSON文本解析,效果:
I am a happy sign XD
文本显示元素的优先级
一个对象里必须要有一个文本显示元素,但如果存在多个文本显示元素,其将会按照优先级决定最终要使用的文本显示元素。
文本显示元素的优先级如下:
text > translate > score > selector > keybind > nbt
因此,对于下面这个元素:
{
"nbt":"",
"block":"0 0 0",
"translate":"block.minecraft.stone",
"selector":"@e[type=zombie]",
"keybind":"key.inventory"
}
因为对象里所有的文本显示元素中 translate的优先级最高,所以输出的文本将使用元素 translate。
与文本产生互动
我们可以与文本产生互动。
将特定文字填入聊天栏:insertion
insertion元素可以让玩家按住⇧ Shift点击文字时,将特定的一串文字输入进玩家的聊天栏中。输入的文本不会替换聊天栏里原有的文本。该元素只有在使用/tellraw
显示时才会有意义。
{
"text":"155652",
"insertion":"155652"
}
如果按住⇧ Shift点击文本,在玩家的聊天栏内将会输入“155652”。
点击文字时产生事件:clickEvent
clickEvent可以用于指定在点击文本时产生的事件。该元素是一个复合标签,值应该用花括号括起。
花括号内必须要有参数 action和 value。 action是点击文本后执行的事件。 value是要执行的事件的值。
action支持以下值:
action的值 | 描述 | value的值 | 可用性 |
---|---|---|---|
open_url |
打开网页 | 网页地址(http://example.com) | 聊天、成书 |
run_command |
发送命令 | 字符串 | 聊天、成书、告示牌 |
change_page |
切换页码 | 正整数 | 成书 |
suggest_command |
输入命令 | 字符串 | 聊天 |
copy_to_clipboard |
复制内容至剪贴板 | 字符串 | 聊天、成书 |
悬浮在文字之上时显示说明提示:hoverEvent
hoverEvent可以用于指定悬浮在文字上时产生的提示文本。该元素是一个复合标签,值应该用花括号括起。
花括号内必须要有参数 action和 value。 action是提示文本的类型。 value是提示文本的内容。
action支持以下值:
action的值 | 描述 | value的值 | 备注 |
---|---|---|---|
show_text |
显示文字 | 原始JSON文本 | 如果要使用原始JSON文本对象,值必须为 复合标签。 |
show_item |
显示物品 | {id:"",Count:,tag:{}} | value为字符串,里面的内容需要转义。 |
show_entity |
显示实体 | {type:"",id:"",name:"",tag:{}} | value为字符串,里面的内容需要转义。 |
原始JSON文本对象间的关系
你可以使用列表,并将多个原始JSON文本对象放入列表中。列表中的每个元素将会依次显示。
下面这个例子拥有2个对象:
[
{
"text": "Welcome to ",
"color": "dark_red"
},
{
"text": "Minecraft!",
"color": "blue"
}
]
效果:
Welcome to Minecraft!
父对象与子对象
在原始JSON文本对象列表中,第一个对象的样式将会影响所有后续的对象。因此,我们可以说第一个对象便是父对象,其余的对象都是子对象。
下面这个例子中,因为子对象继承了父对象的样式,所以整个文本都会采用深红色+下划线的样式:
[
{
"text": "Welcome to ",
"color": "dark_red",
"underlined": true
},
{
"text": "Minecraft"
},
"!"
]
效果:
Welcome to Minecraft!
我们可以让第一个元素为空值,这样父对象就会没有样式,因此也不会有任何样式影响后续的文本:
[
"",
{
"text": "Welcome to ",
"color": "dark_red",
"underlined": true
},
{
"text": "Minecraft"
},
"!"
]
效果:
Welcome to Minecraft!
继承对象的属性:extra
extra内的原始JSON文本将会继承该元素的所有属性。
{
"text": "Welcome to ",
"color": "dark_red",
"underlined": true,
"hoverEvent":{
"action":"show_text",
"value":{
"text":"Minecraft!"
}
},
"extra":[
{
"text":"Minecraft!"
}
]
}
效果:
Welcome to Minecraft!
可以看到, extra内的{"text":"Minecraft!"}
继承了原对象的 color、 underlined和 hoverEvent元素。
另见
|