不良设计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
相关产品推荐
相关产品推荐

