JSON

来自Minecraft Wiki
跳转到导航 跳转到搜索

本条目介绍的是一种轻量级数据交换格式。关于NBT以及JSON的语法和用法,请见“Tutorial:NBT与JSON”。

JavaScript对象表示法(JSON,JavaScript Object Notation)是一种轻量级数据交换格式。[1]

Minecraft使用JSON来储存以下数据:

JSON语句规范

[编辑 | 编辑源代码]

本条目主要描述Minecraft中的JSON语句规范,可能与JSON的原始标准定义有所区别。虽然JSON可以写在一行内,但是一般为了可读性会加入缩进和换行。

对于具体细节,参考ECMA的JSON标准[2]

JSON文本

[编辑 | 编辑源代码]

JSON文本是一组符合JSON数据值语法的,由万国码(Unicode)代码点组成的符号序列。这些符号包括六类结构化符号、字符串、数字值以及三类字面量符号。

六类结构化符号:

  • [:左方括号。
  • {:左花括号。
  • ]:右方括号。
  • }:右花括号。
  • ::冒号。
  • ,:逗号。

三类字面量符号:

  • true
  • false
  • null

其中,null未在Minecraft的数据包标准文件中使用。

JSON数据值

[编辑 | 编辑源代码]

JSON数据值类型可以为:NBT复合标签/JSON对象对象(object)、NBT列表/JSON数组数组(array)、字符串字符串(string)、字节型短整型整型长整型单精度浮点数双精度浮点数数值(number)或布尔型布尔(boolean)。

一个对象,以左右花括号作为首尾,包含0个或若干个键值对。每个键都为一个字符串,其后都使用一个冒号与值相连接。多个不同的键值对间以逗号分隔。对象中所有键值对都由一个键名唯一确定,不能出现同名键。键值对中的值也可以是任意的JSON数据值类型。

{
    "Bob": {
        "ID": 1234,
        "lastName": "Ramsay"
    },
    "Alice": {
        "ID": 2345,
        "lastName": "Berg"
    }
}

一个数组,以左右方括号作为首尾,包含0个或若干个以逗号隔开的数据值。与NBT中的NBT列表/JSON数组列表不同,JSON数组中的数据值可以为不同的数据类型。

["Bob", "Alice", "Carlos", "Eve"]

字符串

[编辑 | 编辑源代码]

每个字符串都被一对双引号"所括,其中包含任意字符的组合。某些特殊字符需要通过反斜杠\进行转义。

  • "foo"
  • "Hello, world"
  • "An escaped \" quote within a string"

连续输入键盘上的任意数字即可得到一个数值。数值可以加入小数点以表示小数,也可以使用e表示指数。

  • 2
  • -0.5
  • 3e6 (=3×106)

布尔值只能为truefalse

{
    "Steve": {
        "isAlive": true
    },
    "Alex": {
        "isAlive": false
    }
}

序列化

[编辑 | 编辑源代码]

序列化(Serialization)也即串行化,是一种将内存程序转换为方便网络传输和数据存储的方法。在Minecraft中,许多与数据包有关的内容都可以被序列化为JSON格式。所以JSON也是一种用来表示游戏内程序对象的一种文本格式。

在数据包被加载时,游戏会尝试将数据包内的JSON文件反序列化(Deserialization)以尝试在内存中还原出一个相应的程序对象。对于JSON所描述的各种JSON数据,基本都要再经过游戏程序本身进行验证——多余的JSON对象可能会被直接丢弃,且会对原JSON数值的范围进行重新计算。在一些严格的验证条件下,这可能导致一些非法的JSON值在数据包加载期间使游戏抛出异常,从而阻断数据包的正常加载。另外,由于要还原出一个完整的程序对象,必须使用JSON给出所有“必要”的对象属性值,否则也会导致加载异常。