了解 NBT 数据及其到 JSON 的转换
Minecraft 的 NBT(命名二进制标签)数据是一种丰富而复杂的格式,用于存储极其全面的信息并表示实体和物品等游戏对象。然而,在 Minecraft 之外使用这种格式可能很困难,特别是将其集成到使用 JavaScript 的基于 Web 的应用程序中时。
尝试从 Minecraft 导出 NBT 数据时会出现一个典型问题,特别是将其转换为正确的 JavaScript 对象或 JSON 格式时。由于 JSON 是一种广泛认可的数据传输格式,因此开发人员经常需要为其基于 Web 的应用程序处理 NBT 数据;然而,转换过程并不简单。
本文介绍如何将 NBT 数据字符串转换为有效的原生 JavaScript 对象或 JSON,以及两种格式之间的差异。我们将研究处理诸如键名中的冒号和阻碍 JSON 解析的嵌套结构等问题的方法。
我们还将了解为什么 Chrome 控制台可以很好地处理这些复杂的字符串,并提供潜在的解决方案来在 JavaScript 中实现类似的结果。最后,您将拥有正确转换 NBT 数据所需的工具,确保与 JavaScript 和在线应用程序的互操作性。
命令 | 使用示例 |
---|---|
.replace(/(\d+)b/g, '$1') | 此正则表达式通过匹配后跟字母“b”的数字并将其替换为数字本身,将 Minecraft 字节表示法(例如“1b”、“2b”)转换为合法数字。 |
.replace(/(\d*\.?\d+)f/g, '$1') | 该命令通过消除数字后面的“f”字符,将以 NBT 编码的浮点值(例如“1.0f”和“0.2f”)转换为传统的 JavaScript 数字。 |
.replace(/uuid:\[I;([\d,-]+)\]/g, ...) | 此 RegEx 模式可识别 UUID 的特殊 NBT 格式(例如 uuid:[I;])并将其转换为有效的 JSON 数组。它收集括号内以逗号分隔的整数并相应地重新格式化它们。 |
JSON5.parse(data) | 此命令使用 JSON5 包来读取宽松的 JSON 语法,这对于不严格遵循正常 JSON 约定的类似 NBT 的数据格式非常有用,例如不带引号的键和单引号字符串。 |
assert.isObject(result) | 此 Chai 库命令在单元测试期间验证解析结果是否是有效的 JSON 对象。它确定 NBT 到 JSON 转换的结果是否是正确的类型。 |
describe('NBT to JSON Conversion', ...) | 此 Mocha 测试命令创建一个测试套件,其中包含一个块,其中包含用于 NBT 到 JSON 转换的许多连接测试用例。它定义了转换函数的预期行为。 |
replace(/:(?!\d)/g, ': "') | 此正则表达式重点关注以冒号分隔的键(例如“the_vault:card”),并且仅当冒号后面的值不是数字时才添加引号,以确保正确的 JSON 键值格式。 |
.replace(/'([^']*)'/g, '"$1"') | 此命令用双引号替换字符串值或键周围的单引号,确保它们在 JSON 格式中有效。这是必要的,因为 JSON 不支持单引号。 |
it('should convert NBT string to JSON format', ...) | 此函数定义测试套件中的单个单元测试。它提供了 NBT 到 JSON 转换应该成功的特定场景,并用断言来证明这一点。 |
解析NBT数据:详细的脚本分解
提供的第一个脚本旨在将 Minecraft NBT(命名二进制标签)数据转换为合适的 JavaScript 对象或 JSON。 NBT 数据的复杂性源于其使用非标准的类 JSON 形式,例如字节、浮点和双精度表示形式。为了克服这些问题,该函数采用了各种正则表达式,包括将“1b”等值转换为整数,将“1.0f”转换为浮点数。这很重要,因为普通 JSON 如果不进行转换就无法支持这些格式。通过解析和替换这些独特的模式,我们可以将NBT数据转换为JavaScript兼容的结构。
该脚本还支持 UUID,它们在 NBT 中编码为“uuid:[I;...]”,这是本机 JSON 不支持的格式。正则表达式匹配 UUID 模式并将其转换为有效的 JSON 数组。另一个值得注意的功能是能够处理包含冒号的键,例如“the_vault:card”。除非键用引号引起来,否则冒号在 JSON 中是有问题的。该脚本小心地插入这些引用,确保数据在转换后保持有效。这种模块化方法使脚本可重用并适应不同的 NBT 架构。
第二种解决方案使用 JSON5 库。与严格的 JSON 不同,JSON5 允许更灵活的语法,例如单引号和不带引号的键。这使其成为处理类似 NBT 格式的理想工具,这些格式的数据不一定严格符合 JSON。 JSON5可以解析此类数据,而不需要复杂的正则表达式。这最大限度地降低了代码复杂性,从而在处理大型或嵌套 NBT 数据时可以更轻松地处理错误并提高性能。
在这两个示例中,代码都是模块化且性能优化的。每个转换函数都可以独立使用,具体取决于 NBT 数据的复杂性。此外,单元测试确认这些函数是准确的,Mocha 和 Chai 验证解析的 NBT 文本是否成功更改为有效的 JSON 对象。这确保了脚本在各种情况下运行,使开发人员能够自信地将这些解决方案集成到他们的应用程序中。
在 JavaScript 中,使用解析函数将 NBT 数据转换为有效的 JSON 对象。
该解决方案使用自定义 JavaScript 解析方法处理 Minecraft NBT 数据。
function parseNBT(data) {
return data
.replace(/(\d+)b/g, '$1') // Convert byte (1b, 2b) to integers
.replace(/(\d*\.?\d+)f/g, '$1') // Convert float (1.0f, 0.2f) to numbers
.replace(/(\d*\.?\d+)d/g, '$1') // Convert double (1.0d, 0.5d) to numbers
.replace(/uuid:\[I;([\d,-]+)\]/g, (match, p1) => {
return `"uuid": [${p1}]`; // Convert "uuid:[I;...]" to valid JSON array
})
.replace(/:(?!\d)/g, ': "') // Add quotes to keys with colons
.replace(/(?!^)\w/g, '",') // Close quotes after values
}
使用 RegEx 转换 NBT 数据以替换 JSON 中的关键问题
该解决方案演示了一种使用 RegEx 将 NBT 数据转换为 JSON 格式的新方法。
function convertNBTtoJSON(data) {
return data
.replace(/(\d+)b/g, '$1') // Convert bytes to integers
.replace(/(\d*\.?\d+)f/g, '$1') // Convert floats to numbers
.replace(/(\d*\.?\d+)d/g, '$1') // Convert doubles to numbers
.replace(/'([^']*)'/g, '"$1"') // Replace single quotes with double quotes
.replace(/([a-zA-Z0-9_]+):/g, '"$1":') // Add quotes around keys
}
使用 JSON5 自动处理类似 NBT 的格式
这种方法使用 JSON5 包直接解析更通用的类 JSON 格式。
const JSON5 = require('json5');
function parseWithJSON5(data) {
try {
return JSON5.parse(data); // JSON5 handles non-strict JSON formats
} catch (error) {
console.error("Error parsing NBT data:", error);
}
}
使用单元测试测试 NBT 到 JSON 的转换
此单元测试脚本确认 NBT 到 JSON 的转换函数使用 Mocha 和 Chai 按预期执行。
const assert = require('chai').assert;
describe('NBT to JSON Conversion', function() {
it('should convert NBT string to JSON format', function() {
const nbtData = 'some NBT data';
const result = parseNBT(nbtData);
assert.isObject(result, 'result is a valid JSON object');
});
});
使用 JavaScript 处理 NBT 数据转换
使用 Minecraft 的 NBT 数据的一个关键组成部分是将其导出以供基于 JavaScript 的应用程序使用的复杂性。 NBT 数据的结构与 JSON 类似,但它包含与本机 JSON 不兼容的字节、浮点和双精度等类型。对于创建 Minecraft 模组实用程序或分析仪表板等工具的开发人员来说,将此数据转换为正确的 JSON 格式对于集成至关重要。
NBT 数据检索包括嵌套对象和数组,有时使用奇怪的语法,例如不带引号的键名或带冒号的值,例如 “the_vault:卡”。传统的 JSON 解析器,例如 JSON.parse(),努力处理这些非标准形式。需要自定义解析脚本来预处理数据并将其转换为与 JSON 标准兼容的格式。
此外,评估现代开发工具(例如 Chrome 控制台)如何轻松管理此类数据也很重要。 Chrome 控制台的灵活性使其能够解释非严格的 JavaScript 对象表示法,甚至可以在不破坏的情况下解析松散格式的数据,这就是为什么只需将 NBT 字符串粘贴到控制台即可完美工作的原因。然而,生产级代码需要更强大的验证,在这些情况下,像 JSON5 这样的库可能是合适的解决方案。
NBT 到 JSON 转换:常见问题
- 什么是NBT数据?
- Minecraft 使用 NBT(命名二进制标签)格式来存储数据结构,例如物品清单、玩家统计数据和世界信息。
- 怎么样 JSON.parse() 处理NBT数据?
- 很遗憾, JSON.parse() 由于包含非标准类型(例如字节和不带引号的密钥),无法直接接受 NBT 数据。
- 为什么Chrome控制台可以解析NBT数据?
- NBT 数据可以在 Chrome 中运行,因为控制台可以处理松散形式的 JavaScript 对象,并以灵活的方式读取非标准的类似 JSON 的格式。
- 什么是 JSON5 以及它有何帮助?
- JSON5 是一个扩展 JSON 的包,允许您解析非标准 JSON 格式,包括不带引号的键和尾随逗号。
- 解析NBT数据时使用正则表达式做什么?
- 正则表达式用于匹配和替换NBT数据中的某些模式,例如转换字节类型(例如, "1b") 转换为适当的 JSON 格式。
关于 NBT 到 JSON 转换的最终想法
将 Minecraft 的 NBT 数据转换为有效的 JSON 需要密切注意 NBT 格式中包含的不一致之处。需要自定义解析脚本来处理字节、浮点和 UUID 格式。如果没有这些,请使用本机 JSON 解析器,例如 JSON解析 会导致错误。
使用正则表达式和框架,例如 JSON5,开发者可以高效管理复杂的NBT数据。这些解决方案提供可靠、可重用的功能,可以轻松集成到基于 JavaScript 的应用程序或工具中。了解这些方法可以在现代开发环境中准确使用 NBT 数据。
来源和参考文献
- 有关将 Minecraft NBT 数据转换为源自 NBT 文档和 Minecraft 命令的 JSON 和 JavaScript 对象的信息。访问: 我的世界 NBT 格式 。
- 使用 JavaScript 正则表达式进行数据操作的技术说明和示例引用自 Mozilla 开发者网络 (MDN)。访问: MDN JavaScript 正则表达式 。
- 关于 JSON5 的附加指南,一种灵活的类似 JSON 的格式,用于处理复杂的 NBT 数据结构,源自 JSON5 官方文档。访问: JSON5 文档 。