Files
netease-modsdk-wiki/docs/wiki/meta/jq.md
2025-03-20 11:52:46 +08:00

11 KiB
Raw Blame History

title, hidden, mentions
title hidden mentions
使用JQ创建附加组件 true
SirLich
Joelant05
MedicalJewel105

使用JQ创建附加组件

引言

"jq就像处理JSON数据的sed工具 - 你可以用它来切片、过滤、映射和转换结构化数据其便捷程度如同用sed、awk、grep等工具处理文本一般。"

https://stedolan.github.io/jq/

jq是一款用C语言编写的JSON处理工具其理念类似于Perl。由于它是专门为解析JSON设计的因此具备许多其他文本处理器所没有的实用特性。jq将其程序定义为过滤器这些过滤器接收JSON数据输入并输出修改后的JSON数据。虽然看似简单但jq包含了许多高级功能在程序化生成附加组件文件时极其有用。

本文将从命令行界面角度解释jq的使用。不过jq基本上已为所有主流编程语言提供了封装器您可以轻松将jq过滤器集成到Go、JavaScript、Java、Ruby、Python、R等语言中。本文将重点讲解针对Minecraft附加组件开发的过滤器设计具体实现方式可根据实际需求选择。

获取jq

官方下载地址:https://stedolan.github.io/jq/download/,下载的可执行文件即开即用

也可以通过系统包管理器安装需确保版本≥jq-1.6)。

各语言封装器列表详见:awesome-jq

基础语法

点操作符

最简单的jq过滤器是点号.它原样返回输入JSON。以下面这个资源包清单为例

::: code-group

{
  "format_version": 2,
  "header": {
    "name": "Example Pack",
    "uuid": "c35537fa-c79d-fd77-cd89-551b7487abed",
    "min_engine_version": [1, 16, 0]
  },
  "modules": [
    {
      "type": "resources",
      "uuid": "199ed596-c0f7-158c-db7d-2da8510690c5",
      "version": [1, 0, 0]
    }
  ]
}

:::

路径访问

要获取header的UUID使用路径表达式.header.uuid

::: code-group

"c35537fa-c79d-fd77-cd89-551b7487abed"

:::

数组操作

访问数组元素示例(获取最低引擎版本的最后一位): .header.min_engine_version[-1]

::: code-group

0

:::

值修改

使用赋值运算符修改格式版本: .format_version = 3

::: code-group

{
  "format_version": 3, // 此处被修改
  "header": {
    ...
  }
}

:::

管道操作

结合map函数对数组元素进行运算 .header.min_engine_version | map(. + 1)

::: code-group

[2, 17, 1]

:::

逻辑运算

条件判断

根据format_version修改描述文本

if .format_version > 1 then 
  .header.description = "大版本" 
else 
  . 
end

逻辑组合

复合条件判断示例:

if (.header.version[0] > 1 and (.modules[0].version[0] > 1 | not)) 
then 
  .header.description = "小版本" 
end

变量定义

变量作用域贯穿后续管道:

{hello: "world"} as $var | $var | .hello

内置函数

数学运算

使用幂函数和平方根函数:

{
  "三次幂": pow(.format_version; 3),
  "平方根": .format_version | sqrt
}

映射处理

使用map_values进行全局字符串替换

.header as $header |
.header = ($header | map_values(
  (select(type == "string") | gsub("示例"; "生产版")
)) + ($header | map_values(select(type != "string")))

键值转换

使用to_entries重构键值对

.header | to_entries | map({(value|tostring): key}) | add

递归处理

使用walk清理空值

walk(if type == "object" then 
  with_entries(select(.value != null)) 
else . end

自定义函数

函数定义语法示例:

def 加法函数($a; $b):
  $a + $b;

def 无参函数:
  1 + 1;

{ 
  "组合字符串": 加法函数("合并"; "字符串"),
  "简单计算": 无参函数 
}

命令行应用

基础使用格式:

jq '[过滤器]' 输入文件.json > 输出文件.json

带参数调用:

jq -n --arg 变量1 $值1 --arg 变量2 $值2 '
{
  "参数1": $变量1,
  "参数2": $变量2
}'

实战案例

将Java版模型转换为基岩版可附着物模型的完整jq脚本含UV重映射

完整转换脚本示例