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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:35:23