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

Ruby编写SonarQube JSON格式化脚本重复数据问题排查

问题解决:SonarQube JSON格式化脚本重复ruleId值的问题

问题本质

你碰到的是Ruby变量作用域导致的对象复用覆盖问题:如果在遍历JSON Lines的循环外部初始化了存储issue数据的哈希变量,每次循环只是修改这个哈希的属性,而非创建新的哈希对象,最终所有issue都会指向同一个哈希实例,自然会被最后一次循环的内容覆盖。而你的简单解析脚本没问题,是因为它每次循环仅读取输出,没有复用同一个可变对象。

修复方案

核心修复逻辑:在每次循环内部创建新的issue哈希对象,避免复用外部定义的同一个对象。

错误示例(导致重复的典型写法)

require 'json'

# 错误:循环外初始化哈希,所有循环复用同一个对象
issue = {}
sonar_report = { issues: [] }

File.foreach('tes.json') do |line|
  data = JSON.parse(line)
  issue[:ruleId] = data['Raw']
  # 其他字段赋值逻辑...
  sonar_report[:issues] << issue
end

puts JSON.pretty_generate(sonar_report)

修正后的代码

require 'json'

sonar_report = { issues: [] }

File.foreach('tes.json') do |line|
  # 关键:每次循环都创建新的哈希对象
  issue = {}
  data = JSON.parse(line)
  
  # 填充SonarQube标准字段
  issue[:ruleId] = data['Raw']
  issue[:message] = "检测到敏感数据:#{data['Raw']}"
  issue[:severity] = 'CRITICAL'
  issue[:type] = 'VULNERABILITY'
  # 安全读取嵌套字段,避免缺失字段报错
  issue[:component] = data.dig('SourceMetadata', 'Data', 'Path')
  issue[:line] = data.dig('SourceMetadata', 'Data', 'LineNumber')
  
  sonar_report[:issues] << issue
end

# 生成SonarQube兼容的报告文件
File.write('sonar-report.json', JSON.pretty_generate(sonar_report))

验证注意事项

  • 测试时可以在循环内临时打印issue内容,确认每一行的ruleId都对应当前行的Raw值
  • 使用dig方法访问嵌套JSON字段,避免因部分Trufflehog输出缺失字段导致脚本崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:40:48