You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不良设计JSON数据清洗:寻求最优处理策略建议

用JQ批量转换游戏元素JSON结构适配MongoDB

核心转换逻辑(单个文件)

假设你的原始JSON结构类似:

{
  "name": "IceGiant",
  "models": {
    "frost_guardian": { "hp": 120, "armor": 30 },
    "ice_shaper": { "hp": 80, "armor": 15 }
  },
  "attacks": {
    "frost_lance": { "damage": 25, "range": 10 },
    "glacial_smash": { "damage": 45, "range": 2 }
  }
}

目标是把models和attacks的键值对结构转成数组对象(每个对象包含原键作为name字段),适配MongoDB的数组查询分析。对应的JQ脚本如下:

.models = (.models // {} | to_entries | map({name: .key} + .value))
| .attacks = (.attacks // {} | to_entries | map({name: .key} + .value))
  • // {}:处理字段为空或不存在的情况,避免转换出错
  • to_entries:将对象的键值对转为{key: "...", value: {...}}格式的数组
  • map({name: .key} + .value):把原键作为name字段,合并到原value对象中

批量处理1000+文件的脚本策略

1. 基础循环处理

用shell循环遍历所有JSON文件,生成转换后的文件(前缀加converted_区分):

# 先备份原始文件到backup目录
mkdir -p json_backup
cp *.json json_backup/

# 批量转换
for file in *.json; do
  jq '.models = (.models // {} | to_entries | map({name: .key} + .value)) | .attacks = (.attacks // {} | to_entries | map({name: .key} + .value))' "$file" > "converted_$file"
done

2. 并行加速处理

如果文件数量大,用xargs开启多进程并行转换(提高效率):

ls *.json | xargs -P 4 -I {} sh -c 'jq ".models = (.models // {} | to_entries | map({name: .key} + .value)) | .attacks = (.attacks // {} | to_entries | map({name: .key} + .value))" "{}" > "converted_{}"'
  • -P 4:启用4个并行进程,可根据CPU核心数调整

3. 覆盖原文件(谨慎使用)

如果不需要保留原始文件,可通过临时文件覆盖(避免直接写入导致文件损坏):

for file in *.json; do
  jq '.models = (.models // {} | to_entries | map({name: .key} + .value)) | .attacks = (.attacks // {} | to_entries | map({name: .key} + .value))' "$file" > temp.json && mv temp.json "$file"
done

验证转换结果

转换完成后,可随机抽取文件验证结构是否符合预期:

# 检查models字段是否为数组
jq '.models | type' converted_IceGiant.json
# 输出应为"array"

# 查看第一个models对象的结构
jq '.models[0]' converted_IceGiant.json
# 输出应包含name字段和原属性

内容的提问来源于stack exchange,提问作者OnlyDean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:04:59