如何用Ruby修改JSON结构?两种目标格式实现求助
问题分析与解决
你代码里的问题
- 变量混淆:
File.read(a)中的a是你定义的示例哈希,不是文件路径,应该替换为实际的源JSON文件路径(比如"input.json") - 错误转换:
hash = hash_data.to_s把哈希转成了字符串,字符串的each只能遍历单个字符,无法获取键值对,这是NoMethodError的直接原因 - 目标键错误:你判断的是
key == "_id",但实际要处理的是"_nb"键 - 逻辑错误:直接在遍历的哈希上修改可能引发遍历异常,且处理嵌套哈希的逻辑不对
解决方案
方案1:转换为第一种格式(保留_nb作为键)
用map遍历原哈希的键值对,对_nb对应的嵌套哈希做值提取,其他键值对直接保留,最后转回哈希:
require 'json' # 读取源JSON文件 hash_data = JSON.parse(File.read("input.json")) # 重构哈希 transformed_hash = hash_data.map do |key, value| if key == "_nb" [key, value.values.first] else [key, value] end end.to_h # 写入目标文件 File.open("src.json", "w") do |f| f.write(JSON.pretty_generate(transformed_hash)) end
输出结果:
{ "_nb": "55dd0", "conf": "linux" }
方案2:转换为第二种格式(用$nb作为键)
用flat_map展开嵌套哈希的键值对,替换原_nb键为嵌套内的$nb键:
require 'json' hash_data = JSON.parse(File.read("input.json")) # 重构哈希 transformed_hash = hash_data.flat_map do |key, value| if key == "_nb" value.to_a else [[key, value]] end end.to_h # 写入目标文件 File.open("src.json", "w") do |f| f.write(JSON.pretty_generate(transformed_hash)) end
输出结果:
{ "$nb": "55dd0", "conf": "linux" }
补充说明
- 确保源JSON文件路径正确,文件内容符合你给出的示例格式
JSON.pretty_generate用于生成格式化的JSON输出,避免压缩成单行flat_map的作用是将嵌套的键值对数组展开为单层,刚好适配第二种格式的需求
内容的提问来源于stack exchange,提问作者Kamilo
相关产品推荐
相关产品推荐

