本站文本内容除另有声明外,转载时均必须注明出处。(详情…本站文本内容除另有声明外,转载时均必须注明出处。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。
各位用户:为了让我们能更好了解您的需求,提供更优良的服务,请帮助我们填写一份问卷。编者问卷读者问卷(需要花费7分钟左右)

Hi Gamepedia users and contributors! Please complete this survey to help us learn how to better meet your needs in the future. We have one for editors and readers. This should only take about 7 minutes!

教程/NBT与JSON

来自Minecraft Wiki
跳转至: 导航搜索
本页面不适合使用可视化编辑器编辑
本页含有大量的样式等技术性内容,可视化编辑器可能无法很好地处理。
Information icon.svg
此特性为Java版基岩版独有。

本教程主要讲述NBT标签以及JSON组合的语法。关于NBT标签的实际用法可以参见教程/NBT命令标签

NBT和JSON在Minecraft命令中十分常见。如/summon 实体id 坐标 标签中的“标签”,就是NBT格式的,如/summon creeper ~ ~ ~ {powered:1b}(召唤一只闪电苦力怕)。又如,NBT可用于实体选择器,如/kill @e[type=creeper,nbt={powered:1b}](杀死所有闪电苦力怕)。JSON在命令中的使用,如/tellraw @s {"text":"点击此处自杀","clickEvent":{"action":"run_command","value":"/kill"}}。在上述实例中,红色文字表示的是NBT。

JSON可以作为告示牌文本及物品名称,但用在NBT中必须变成字符串格式且一般需要转义,如/give @s diamond_sword{display:{Name:"{\"text\":\"一个普通的钻石剑\",\"color\":\"dark_red\",\"italic\":false}"}}。JSON在数据包和资源包中也十分普遍。语言文件、方块模型、进度信息、合成配方等都是用JSON定义的。


NBT的语法[编辑 | 编辑源代码]

NBT类似于一个表格,其每个标签都有名称和值。我们做一个类比,石头的名称石头,它的硬度,它的透光性不透光,其开采工具;玻璃,其名称玻璃硬度透光性透光开采工具。这里的“硬度”“透光性”等,都是标签名称;“硬”“不透光”则是其值。标签的名称和值应该匹配起来。如果说石头的硬度透光开采工具,这就无法理解了。

标签的值除了是一个数值或字符串之外,还可以是一组新的标签(称为组合),或者是一组没有名称的值(称为列表)。后面的内容会详细提到。

NBT复合标签的基本语法是使用花括号括起来,里面含有众多标签,每一个标签是“标签名称:”的格式。多个标签用逗号隔开。参考下面这些实例,有助于更好地了解NBT的写法。

简单的NBT[编辑 | 编辑源代码]

参见:命令§数据标签NBT格式§标签的定义

以下面的命令为例:/summon zombie ~ ~ ~ {CustomName: "\"快乐的小僵尸\"", CustomNameVisible: 1, IsBaby: 1} 该命令召唤出一只小僵尸。

这里的“CustomNameVisible: 1”就是一个标签,其中,CustomNameVisible是其名称1是其

一个NBT可以只有一个标签,也可以有多个标签。上面的实例中,CustomName: "\"快乐的小僵尸\""也是标签。

一般地,标签名称只能包含英文字母,值有以下类型及表述方式:

  • 数字。一般,在数字后面加一个英文字母以表示其值,比如1b就表示布尔值的1。但是,数字后面的字母是可以省略的。系统可以自动将其转化为对应的形式。也就是说,我们完全可以用我们日常生活中习惯的直接表示数字(整数或小数)的方法表示数字,如3218.32。以下各种具体的数字存储类型,供有经验的人参考。
    • 字节:1个字节,值在[-128,127](这是数学中区间集合的表示方法)之间的整数,用“b”表示。一般表示其某项功能是否开启,常作为布尔值使用,因此其值通常为0b1b,如上述僵尸的标签的CustomNameVisible(名称是否可见),若其值为1b则可以看见其名字,若为0b则表示只有指向它时才能看见它的名字。
    • 短整型:2个字节,值在[-32768,32767]之间的整数,用“s”表示。如旧版本的Health(表示生命值),32767s是其最大值。附魔的级别也是短整型,因此,能通过命令实现的最大的附魔级别是32767级。
    • 整型:4字节,值在[-2147483648,2147483647]之间的整数,用“s”表示。比如用数字表示的方块/物品id(从1.8就被移除了)。
    • 长整型:8字节,值在[-9223372036854775808,9223372036854775807]之间的整数,在NBT中极为罕见。它可以用来表示极大的数字。
    • 单精度浮点型:32位单精度浮点数,用“f”表示。如实体的Health(生命值),就是浮点型。虽然我们在游戏内看到的实体生命值通常是整数,半个心代表1,事实上,生命值在存储时,是可以有小数的。
    • 双精度浮点型:64位双精度浮点数。
  • 字符串:和大多数语言的字符串一样,表示一系列文本。用“"字符串内容"”表示,注意必须使用半角双引号,单引号、中括号均无效,类似于r"ab\cd"的用法也无效。它可以对双引号进行转义)。比如,上面的例子中的"\"快乐的小僵尸\""。转义是用来表示特殊字符,后文会详细提及。此外,如果字符串没有标点符号(可以含有下划线_),引号可以省去。
  • 列表:类似于数组。参见#列表
  • 整型数组:从-2147483648到2147483647的整数数组,用逗号分隔并用方括号包含。比如,区块文件的高度地图、方块列表、生物群系排布。
  • 复合标签:参见#复合标签

复合标签[编辑 | 编辑源代码]

NBT的复合标签可以作为一个值。比如,下面例子中的绿色文字就是一个组合,它作为了“display”的值。

/give @s stick{display:{Name:"\"谎言之杖\""}}

复合标签可以看做是一个新的NBT,同样也是用逗号隔开标签,用冒号隔开标签名称与值。当然,组合内还可以有组合。

列表[编辑 | 编辑源代码]

列表通常与组合一起出现,比如下面的例子:

/summon spider ~ ~ ~ {Passengers:[{id:"minecraft:skeleton"}]}

该命令用于召唤蜘蛛骑士,即骷髅骑在蜘蛛身上。这个例子中的绿色文字就是一个列表,它的唯一一个值就是一个组合。

一个列表可以有零个、一个或多个值,比如:

/summon zombie ~ ~ ~ {ArmorItems:[{id:"minecraft:diamond_boots",Count:1b},{id:"minecraft:diamond_leggings",Count:1b},{id:"minecraft:diamond_chestplate",Count:1b},{id:"minecraft:diamond_helmet",Count:1b}]}

该命令用于召唤一个穿着全套钻石盔甲的僵尸。绿色文字表示的列表含有4个值,每一个值都是一个组合。

实际上,列表的每个标签都含有标签名称,注意是以0开始计数的。因此上面的绿色文字也可以写为:

[0:{id:"minecraft:diamond_boots",Count:1b},1:{id:"minecraft:diamond_leggings",Count:1b},2:{id:"minecraft:diamond_chestplate",Count:1b},3:{id:"minecraft:diamond_helmet",Count:1b}]

一般不推荐使用后一种写法。

列表的值也可以是字符串。

字符串的转义[编辑 | 编辑源代码]

在NBT中,字符串可以转义,但是只支持引号和反斜杠的转义。比如:

/give @s paper{display:{Name:"{\"text\":\"一张空纸\",\"color\":\"red\"}"}}

上面这个例子中,红色的文字表示了一整个字符串,其中绿色的文字表示转义的引号。字符串的内容将会被解释成如下内容:

{"text":"一张空纸","color":"red"}

(这是一个JSON文本。在NBT中,它被当做一个字符串使用。)

在NBT的字符串中,要表示一个双引号应用\"表示,如果要表示一个反斜杠则应该使用\\。所以,如果在字符串中要表示\",则应该使用\\\"

与JSON、Python、Lua等大多数程序语言不同,NBT只允许转义引号和反斜杠,因此不支持\n、\b、\u00a7等转义方式。\后面只有是\"时才会被转义(此时,被转义的\"不能再转义其他的字符,也不能够作为字符串的分界线),其他的情况统统不转义。

NBT路径的表示方法[编辑 | 编辑源代码]

/data get/modify.../remove block/entity ... 路径中“路径”就是通过一系列标签名称定义到这个标签。

比如,powered路径,就是索引到标签名称为powered的标签。例如,/data get entity @e[type=creeper,limit=1] powered即可查询这只苦力怕是否为闪电苦力怕。

表示复合标签中的标签时,使用.。比如,{a:{b:{c:"某某文字"}}},索引a.b.c就可以得到“"某某文字"”。

表示列表中的特定的元素时,使用[n](n为自然数,表示该列表中的第n+1个值)。比如,/data get entity @e[type=zombie,limit=1] ArmorItems[0].id表示,获取僵尸的脚上穿的物品的id(可能不存在)。又比如,/data get entity @s Inventory[3]表示获取自己的物品栏的第4个物品的信息。

JSON的语法[编辑 | 编辑源代码]

JSON的语法与NBT比较相似,但有以下区别:

  • JSON的数字不分为整型等类型,因此不支持1b2s这样的表达,直接使用12即可。
  • 在JSON中,标签、标签名称、标签值常称为域、键、值(就像Python的字典和Lua的表一样)。在JSON中,表示键也必须用引号括起来,就像表示字符串一样。
  • JSON有布尔值true与false。
  • JSON的字符串也只允许双引号(就像NBT那样),单引号字符串不接受,但是支持\n\u00a7等转义,未知的转义(如\a)仍将报错。JSON的字符串在任何时候下都不可以省略引号(NBT可以)。
  • JSON的语法很严格,比如,对象与列表的最后一项之后不能有逗号。

习惯上,JSON的表达应该经常换行,并且适当缩进(通常将2个空格作为一个缩进),例如以下是一个数据包的pack.mcmeta

{
  "pack": {
    "pack_format": 1,
    "description": "一个简单的数据包"
  }
}

/tellraw/title等命令中的JSON不支持换行。(一般情况下,复制一段带有缩进符号和换行符的文字,然后在游戏内按Ctrl+V粘贴,换行符和缩进符号会被自动过滤。)

编造比较复杂的JSON文本时,你可以进入bejson.cn等具有解析、纠错、转义、反转义、标准格式(更加美观)、压缩(去除多余空格、换行、缩进)等功能的网站。

JSON的用途[编辑 | 编辑源代码]

JSON在数据包、资源包和JSON文本中有极大作用。参见教程/制作资源包教程/制作数据包教程/JSON文本

JSON用于基岩版命令[编辑 | 编辑源代码]

在1.1后(包括)的基岩版拥有了原版的nbt。适用于/give/replaceitem,并且只有2个:can_place_oncan_destroy。其语法如下:

  • {"minecraft:can_place_on":{"blocks":["方块1","方块2"…]}}
  • {"minecraft:can_destroy":{"blocks":["方块1","方块2"…]}}

注意方块用英文(如"air")而并非数字id(如0)。

例如:/give @s diamond_pickaxe 1 0 {"minecraft:can_destroy":{"blocks":["stone"]}}可以获得一个允许冒险模式玩家破坏石头的钻石镐。冒险模式的玩家如果没有拿着这样的镐就无法破坏任何方块,拿着这把镐也只能破坏石头,不能破坏其他方块。该命令相当于Java版的/give @s diamond_pickaxe{CanDestroy:[stone]}

又一个实例:/give @s tnt 1 0 {"minecraft:can_place_on":{"blocks":["sand","tnt"]},"minecraft:can_place_on":{"blocks":["redstone_block"]}}