JSON形式とは
JSON 形式とは、データの表記法の一種です。 一部のコマンドでこの形式を扱うことがある他、アドオンのデータのほとんどはこの形式で書かれています。
JSON(JavaScript Object Notation) は文字通りJavaScriptのオブジェクトを元に作られました。
JavaScriptにとってJSONとは何か特別なものではなくただのオブジェクトである、という認識ができれば正しい記述ができるようになります。 (実際には完全に同じではありませんが)
よって、正確な理解のためには、JavaScript(または他のプログラミング言語)の基礎を学ぶ必要があります。
JSON形式の書き方
例文を通してJSON形式について簡単な解説をします。 ここでは深く考えずに、だいたいこんな感じで書く、くらいの理解から始めてください。
コマンドでは1行になっている
それでは/give
や/replaceitem
でつかうアイテムコンポーネントの記述の仕方を見ていきましょう。
# 「石・丸石」だけ壊せる「鉄のツルハシ」を与える
/give @s iron_pickaxe 1 0 {"minecraft:can_destroy":{"blocks":["stone","cobblestone"]}}
後半のこの部分がJSON形式で書かれた部分です。
{"minecraft:can_destroy":{"blocks":["stone","cobblestone"]}}
これは次のような記述が1行になっています。
{
"minecraft:can_destroy": {
"blocks": ["stone", "cobblestone"]
}
}
JSON形式とは本来は1行で書くものではなく、通常は上のように改行されたり、字下げ(インデント)をしてわかりやすいように書かれています。
しかしコマンドではチャット欄で入力できるように無理矢理1行になっています。 いきなり1行で書くのは難しいので、まずはこのように複数行に分けて書いてから、最後に1行へと直しましょう。
配列
ブロック名の部分は配列と呼ばれる形式です。
,
(コンマ)で区切って複数書くことができます。
ブロック名は文字なので「"
(ダブルクォーテーション)」で囲ってください。
これらが配列を意味する[]
で囲まれているという構造です。
// アイテム名が2つ入っている
["stone", "cobblestone"]
// 中身が1つでもちゃんとした配列(コンマなし)
["A"]
// これは[]が無いので、ただの文字
"stone"
// いくつでも続けることができる
["A", "B"]
["A", "B", "C", "D", "E"]
オブジェクト
このような配列[]
がオブジェクト{}
の中に入っています。
{
"blocks": ["stone", "cobblestone"]
}
オブジェクト{}
とは次のように、内容に名前を付けてまとめた構造のことです。
上の場合は1組しかありませんが、複数入れることもできます。
{
"名前1": "「名前1」の内容",
"名前2": "「名前2」の内容",
"名前3": "「名前3」の内容"
}
今回の場合はblocks
という名前の箱の中にブロック名の配列[]
が入っている、と考えてください。
さらにこのまとまりがminecraft:can_destroy
という名前の箱に入っています。
{
"minecraft:can_destroy": "(blocksが入っているオブジェクト)"
}
これらをまとめると次の構造になります。最初に開いたものと同じです。
{
"minecraft:can_destroy": {
"blocks": ["stone", "cobblestone"]
}
}
「minecraft:can_destroy
という名前の箱の中にblocks
という名前の箱があり、さらにその中にブロック名のまとまり(配列)が入っている」という構造が見えましたか。
よって、このJSONで設定する内容は次のようになります。
- 壊せるブロック(
can_destroy
)という設定をします - その対象ブロック(
blocks
)は[]
の中のものにします
そしてこれを1行で書くと最初のコマンドの中での記述になります。
{ "minecraft:can_destroy": { "blocks": ["stone", "cobblestone"] } }
1行にしたことでかなり読みづらくはなりましたが、意味を読み取れるでしょうか。
さらに色分けを抜いてみましょう。内容を理解していれば読めますが、どうでしょうか。
{"minecraft:can_destroy":{"blocks":["stone","cobblestone"]}}
しかし、書く場合には、慣れていてもいきなり1行で書くことはかなり難しいです。 普段はここでやったように、複数行に分けて書いてから1行に直して入力するようにしましょう。
複数組み合わせる
アイテムコンポーネントの要素は同時に使うことができます。 アイテムをインベントリに固定する次の要素を一緒に使ってみましょう。
{
"minecraft:item_lock": {
"mode": "lock_in_inventory"
}
}
オブジェクトは1つだけではなく複数の値を持つことができるのでした。 これを一緒に書くと次のようになります。 配列と同じように繋げる場合はコンマを入れてください。 ただし最後には付けてはいけません。
{
"minecraft:can_destroy": {
"blocks": ["stone", "cobblestone"]
}, // <- コンマを付けてつなげる
"minecraft:item_lock": {
"mode": "lock_in_inventory"
} // <- 最後はコンマ無し
}
これらを1行にしてコマンドとして使うと次のようになります。
/give @s iron_pickaxe 1 0 {"minecraft:can_destroy":{"blocks":["stone","cobblestone"]},"minecraft:item_lock":{"mode":"lock_in_inventory"}}
複雑なだけでなくとても長いですね。 それでもここまでやってきたように、きちんと手順を踏めば理解して進めることができます。
- いきなり1行で書かず、複数行に分けて書いてから1行に直す
- コマンド上の1行でわからなければ複数行に改行してわかりやすくする