Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
注册
Advertisement
Disambig gray  本文章介绍的是Java版中原始JSON文本的详细使用方法。关于JavaScript对象表示法(JSON),请见“JSON”。关于NBT以及JSON的语法和用法,请见“教程/NBT与JSON”。
Information icon
此特性为Java版独有。

原始JSON文本(Raw JSON text)是指在Minecraft中使用JSON语言表示的文本。

本文章将介绍原始JSON文本的格式,阅读本教程时应该要对JSON的语法和用法有一定的了解。

用途[]

Sign json

告示牌使用了原始JSON文本。图中为一个白桦木告示牌,文字的颜色是通过命令设置的

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文本里也是可用的。

{
  "text": "\\u00A7会被转义成\"分节符\""
}

效果:

\u00A7会被转义成"分节符"

对文本进行装饰[]

有时候我们要将文本渲染成特定的颜色,或者应用特定的格式。这时候以下元素便可以帮助我们渲染文本。

为文本添加颜色:color[]

 color用于指定对象内文本的颜色,其值可以为颜色名称或十六进制颜色代码。

以下为所有可用的文本值:

代码 名称 前景色 背景色
R G B Hex R G B Hex
§0 black 黑色 0 0 0 000000 0 0 0 000000
§1 dark_blue 深蓝色 0 0 170 0000AA 0 0 42 00002A
§2 dark_green 深绿色 0 170 0 00AA00 0 42 0 002A00
§3 dark_aqua 湖蓝色 0 170 170 00AAAA 0 42 42 002A2A
§4 dark_red 深红色 170 0 0 AA0000 42 0 0 2A0000
§5 dark_purple 紫色 170 0 170 AA00AA 42 0 42 2A002A
§6 gold 金色 255 170 0 FFAA00 42 42 0 2A2A00
§7 gray 灰色 170 170 170 AAAAAA 42 42 42 2A2A2A
§8 dark_gray 深灰色 85 85 85 555555 21 21 21 151515
§9 blue 蓝色 85 85 255 5555FF 21 21 63 15153F
§a green 绿色 85 255 85 55FF55 21 63 21 153F15
§b aqua 天蓝色 85 255 255 55FFFF 21 63 63 153F3F
§c red 红色 255 85 85 FF5555 63 21 21 3F1515
§d light_purple 粉红色 255 85 255 FF55FF 63 21 63 3F153F
§e yellow 黄色 255 255 85 FFFF55 63 63 21 3F3F15
§f white 白色 255 255 255 FFFFFF 63 63 63 3F3F3F

下面的实例会将“Welcome to Minecraft!”渲染为深红色:

{
  "text": "Welcome to Minecraft!",
  "color": "dark_red"
}

效果:

Welcome to Minecraft!

如果不使用 color,使用格式化代码也是可以的,但是必须使用\u00A7来代替§

{
  "text": "\u00A74Welcome to Minecraft!"
}

效果同上。

此外,你还可以用十六进制颜色代码来添加颜色。十六进制颜色代码使用"#<hex>"的格式输入,字母的大小写不受限制。相比于文字值,十六进制代码可以指定绝大部分颜色,可以用于自定义颜色。

下面的实例会将“Welcome to Minecraft!”渲染为颜色代码为#1BFF00的绿色:

{
  "text": "Welcome to Minecraft!",
  "color": "#1BFF00"
}

效果:

Welcome to Minecraft!

为文本添加格式:bold、italic、underlined、strikethrough和obfuscated[]

 bold(粗体)、 italic(斜体)、 underlined(下划线)、 strikethrough(删除线,中划线)和 obfuscated(随机字符)可以将文本设置为特定的格式。这些元素都是布尔值。

这五个元素分别对应了格式化代码§l、​§o、​§n、​§m§k,并可以对应互相替代。

这些元素可以放在一起使用,这样这些格式将会叠加在一起。

下面的对象将会为文字设置加粗和倾斜效果:

{
  "text": "The text with bold and italic",
  "bold": true,
  "italic": true
}

效果:

The text with bold and italic

 obfuscated本质上和其他添加格式的元素相同,但它将会把文本变为会一直变化的随机字符。游戏只会选择与原文本等宽的字符作为其随机字符。

如果这些元素的值被设为“false”,那么它将不会应用该格式。

为文本指定字体:font[]

 font用于指定对象内文本的字体,使用的字体需要在assets/<namespace>/font内进行定义。若输入字体内不存在的字符,它将会显示为一个方框。字体可以通过资源包添加。

Different Fonts in Minecraft

使用游戏中存在的4种字体显示文本“Minecraft Wiki”,从上到下依次是预设字体、Unicode字体、标准银河字母和“illageralt”字体

游戏内存在的字体有:

  • minecraft:default:预设字体。注意,若开启“强制使用Unicode字体”,其中的字符依旧会变为Unicode字体。
  • minecraft:uniform:Unicode字体。开启“强制使用Unicode字体”后显示的字体。
  • minecraft:alt:标准银河字母。在附魔台上会使用此字体。
  • minecraft:illageraltMinecraft Dungeons中使用的符文字体。

记分项分数:score[]

 score可以用于显示指定实体的记分项的分数。该元素是一个复合标签,值应该用花括号括起。

花括号内必须要有参数 name objective name是要显示分数的实体,其值可以为玩家名、目标选择器或*(选择阅读这段原始JSON文本的实体)。使用目标选择器时,不允许选择多个实体。 objective是对应的记分项名。

{
  "score": {
    "name": "Jim",
    "objective": "dummy"
  }
}

这会显示Jim在记分项dummy上的分数。Jim并不一定需要在线,甚至不一定需要存在。如果Jim在dummy上没有分数,那么将什么都不会显示。

实体选择器:selector[]

 selector会显示所有被选中的实体的名称。其值为一个目标选择器

下面的对象将会显示所有苦力怕的名称:

{
  "selector": "@e[type=creeper]"
}

效果:(假设已加载区块中只有一只苦力怕)

苦力怕

如果选择到了多个实体,那么它默认将会以“实体A, 实体B, 实体C, …”的形式列举,但可以通过 separator修改。

使用这种方法输出的文本可以通过⇧ Shift+左键获取对应实体的UUID。

按键键位:keybind[]

 keybind用于显示对应功能的按键,其可以因玩家的设定偏好而改变。

下面的对象将会显示代表打开物品栏的键位:

{
  "keybind": "key.inventory"
}

效果:

e

但如果更改了键位,那么它会显示为改变后的打开物品栏的键位。

本地化键名:translate[]

 translate大体上有两种用途:

  • 在不同的语言下显示不同文本,其值为一个本地化键名。
  • 建立一个文本模板,再将合适的值替换进去。

下面的对象使用了石头的本地化键名,将会显示石头的名称:

{
  "translate": "block.minecraft.stone"
}

在中文里,它会显示为石头,但如果将游戏语言切换为英语,这个对象又会显示为Stone。游戏里除闪烁标语外的所有需要显示文本的地方都使用了本地化键名。

如果本地化键名在所选语言里没有对应值,它将使用en_us.json里该本地化键名的值。如果该本地化键名无法在任何语言文件里被找到,游戏会直接输出本地化键名。如果要添加本地化键名,则需要使用资源包

下面我们再来看带有参数的本地化键名。multiplayer.player.joined就是一个例子,它在中英文语言文件里的值分别为%s加入了游戏%s joined the game。其中%s是一个参数。当有玩家加入游戏时,游戏会自动输出这个标识符,并将玩家名称填入%s的位置。

现在,我们来尝试输出:

{
  "translate": "multiplayer.player.joined",
  "color": "yellow"
}
游戏语言为中文时:
加入了游戏
游戏语言为英语时:
 joined the game

显然,%s没有输出任何内容,这是因为我们还没有向参数赋值。这时,就必须用到 with

为其中的参数赋值: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"}

自定义输出文本[]

我们不仅可以利用语言文件中的本地化键名,还可以自定义一个本地化键名。

简单来说,在 translate中填写一个含有参数的字符串,再在 with中填入需要传递的值,就可以了。

{
  "translate": "第一个物品是%s,第二个物品是%s",
  "with": [
    { "translate": "block.minecraft.grass_block" },
    { "translate": "block.minecraft.sand" }
  ]
}

效果:

第一个物品是草方块,第二个物品是沙子

NBT标签的值:nbt[]

 nbt用于获取方块、实体或命令存储NBT标签的值,其以NBT路径的形式书写。

 block entity storage用于指定要获取标签的方块、实体或命令存储。

 block的值是一组方块坐标,以“<x> <y> <z>”的形式书写。其可以使用相对坐标,这时以生成文本的位置为基准点。

下面的对象将会显示执行者下面的方块的“Items”标签的值:

{
  "nbt": "Items",
  "block": "~ ~-1 ~"
}

 entity的值是目标选择器。如果选择到了多个实体,那么获取的值将会依次列举。默认以, 分隔,但可以用 separator修改。

下面的对象将会显示最近玩家的“Health”标签的值:

{
  "nbt": "Health",
  "entity": "@p"
}

 storage的值是命名空间ID。

下面的对象将会显示存储test:a中“a”标签的值:

{
  "nbt": "a",
  "storage": "test:a"
}

 block entity storage只能使用其中的一个。若存在多个,则按以下优先级选择最终要使用的元素:

 block >  entity >  storage

将获取的值解析为原始JSON文本:interpret[]

HappyBirchSign

位于147 78 48处的“happy sign”

 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

如果一个对象里使用了多个相同的元素(例如连续使用了两次 text),那么只有最后的元素会生效。

与文本产生互动[]

将特定文字填入聊天栏: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 contents必须有其一。 action是提示文本的类型。 value contents是提示文本的内容。

 action接受以下值:

 action的值 描述  value contents的值 备注
show_text 显示文字 原始JSON文本  value contents可以是字符串、复合标签或列表。
show_item 显示物品 "{id:\"<命名空间ID>\",Count:<数量>,tag:{<NBT标签>}}"  value contents为字符串,里面的内容需要转义。
show_entity 显示实体 "{type:\"<实体类型ID>\",id:\"<UUID>\",name:<实体显示名称>}"  value contents为字符串,里面的内容需要转义,其中 name为另一原始JSON文本。

分隔文本中的多个项目[]

为文本指定分隔符:separator[]

 separator用于指定当文本选中多个元素的字符串或原始JSON文本,如 selector或其他键时,使用的分隔符。

也就是说,若一个元素有多个显示,我们可以指定用特殊符号将其分隔开来。若不设定的话,预设为,

示例1:不指定分隔符。

{
  "selector": "@e[type=marker]"
}

效果:

标记, 标记, 标记, ...

示例2:使用作为分隔符。

{
  "selector": "@e[type=marker]",
  "separator": {
    "text": "、"
  }
}

效果:

标记、标记、标记、...

原始JSON文本对象间的关系[]

你可以使用列表,并将多个原始JSON文本对象放入列表中。列表中的每个元素将会依次显示。但是需要注意的是,列表中的第2、3、4……个元素会继承第1个元素的样式(如有),但第2、3、4个元素的样式不被继承。

下面这个例子拥有2个对象:

[
  {
    "text": "Welcome to ",
    "color": "dark_red"
  },
  {
    "text": "Minecraft!",
    "color": "blue"
  }
]

效果:

Welcome to Minecraft!

父对象与子对象[]

在原始JSON文本对象列表中,第一个对象的样式将会影响所有后续的对象。事实上,其余对象都是第一个对象的附属(siblings)。

下面这个例子中,因为子对象继承了父对象的样式,所以整个文本都会采用深红色+下划线的样式:

[
  {
    "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元素。

需要注意的是,使用列表与使用"extra"属性的对象是等价的,也就是说,下面两种JSON等价:

[{"text": "1"}, "2", "3", "4"]
{
  "text": "1",
  "extra": ["2", "3", "4"]
}

参见[]

Advertisement