将 Minecraft NBT 数据转换为 JavaScript 应用程序的有效 JSON

将 Minecraft NBT 数据转换为 JavaScript 应用程序的有效 JSON
将 Minecraft NBT 数据转换为 JavaScript 应用程序的有效 JSON

了解 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 转换:常见问题

  1. 什么是NBT数据?
  2. Minecraft 使用 NBT(命名二进制标签)格式来存储数据结构,例如物品清单、玩家统计数据和世界信息。
  3. 怎么样 JSON.parse() 处理NBT数据?
  4. 很遗憾, JSON.parse() 由于包含非标准类型(例如字节和不带引号的密钥),无法直接接受 NBT 数据。
  5. 为什么Chrome控制台可以解析NBT数据?
  6. NBT 数据可以在 Chrome 中运行,因为控制台可以处理松散形式的 JavaScript 对象,并以灵活的方式读取非标准的类似 JSON 的格式。
  7. 什么是 JSON5 以及它有何帮助?
  8. JSON5 是一个扩展 JSON 的包,允许您解析非标准 JSON 格式,包括不带引号的键和尾随逗号。
  9. 解析NBT数据时使用正则表达式做什么?
  10. 正则表达式用于匹配和替换NBT数据中的某些模式,例如转换字节类型(例如, "1b") 转换为适当的 JSON 格式。

关于 NBT 到 JSON 转换的最终想法

将 Minecraft 的 NBT 数据转换为有效的 JSON 需要密切注意 NBT 格式中包含的不一致之处。需要自定义解析脚本来处理字节、浮点和 UUID 格式。如果没有这些,请使用本机 JSON 解析器,例如 JSON解析 会导致错误。

使用正则表达式和框架,例如 JSON5,开发者可以高效管理复杂的NBT数据。这些解决方案提供可靠、可重用的功能,可以轻松集成到基于 JavaScript 的应用程序或工具中。了解这些方法可以在现代开发环境中准确使用 NBT 数据。

来源和参考文献
  1. 有关将 Minecraft NBT 数据转换为源自 NBT 文档和 Minecraft 命令的 JSON 和 JavaScript 对象的信息。访问: 我的世界 NBT 格式
  2. 使用 JavaScript 正则表达式进行数据操作的技术说明和示例引用自 Mozilla 开发者网络 (MDN)。访问: MDN JavaScript 正则表达式
  3. 关于 JSON5 的附加指南,一种灵活的类似 JSON 的格式,用于处理复杂的 NBT 数据结构,源自 JSON5 官方文档。访问: JSON5 文档