We are currently performing an upgrade to our software. This upgrade will bring MediaWiki from version 1.31 to 1.33. While the upgrade is being performed on your wiki it will be in read-only mode. For more information check here.

教程/原始JSON文本

出自Minecraft Wiki
跳到: 導覽搜尋

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

本文章將介紹原始JSON文本的格式,閱讀本教程時應該要對JSON的語法和用法有一定的了解。

從數據類型上講,一個原始JSON文本一般是字符串、對象(object,也叫組合)及列表。

用途[編輯 | 編輯原始碼]

告示牌使用了原始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文本里也是支持的。

對文本進行裝飾[編輯 | 編輯原始碼]

有時候我們要將文本渲染成特定的顏色,或者應用的特定格式。這時候以下元素便可以幫助我們渲染文本。

為文本添加顏色: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_tw.json里的原始值如下:

Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!

如果只使用
 translate元素,它看起來是這樣的:

Prefix,  again  and  lastly  and also  again!

現在,我們用
 with來給這些參數賦值:

{
  "translate":"translation.test.complex",
  "with":[
    "a",
	{"text":"b"},
	{"text":"c","color":"dark_red"}
	]
}

它看起來是這個樣子的:

Prefix, ab again b and a lastly c and also a again!

原始值中的「%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[編輯 | 編輯原始碼]
位於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

因此,對於下面這個元素:

{
  "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://website.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元素。

另見[編輯 | 編輯原始碼]