如何从含转义字符的嵌套哈希提取键值并生成表头表格
解决Ruby哈希提取键值对并生成表格的问题
我看你遇到的问题主要出在几个细节上:没处理json_hash[:results]里的JSON字符串、目标键的层级不对,还有遍历的对象搞错了。咱们一步步来修正:
核心问题分析
你当前的json_hash[:results]里存的是JSON格式的字符串,不是直接的Ruby哈希,所以直接用select肯定抓不到值;另外instanceType是在configuration这个子哈希里,不是顶层键,keys_to_extract直接写它也找不到。还有你对整个json_hash调用map,而json_hash是个哈希,map会遍历它的键值对(比如:results、:query_info这些),这完全不是你要操作的对象。
修正后的代码步骤
1. 解析JSON字符串为Ruby哈希
首先得把results数组里的JSON字符串转成Ruby哈希,用JSON.parse处理:
require 'json' json_hash = {:results=>["{\"resourceId\":\"i-5ee33\",\"configuration\":{\"instanceType\":\"m4.2xlarge\"},\"tags\":[{\"tag\":\"aws:au\\u003db\",\"value\":\"b-1a\",\"key\":\"awsss\"},{\"tag\":\"Kernluster\\ulues\",\"value\":\"blu\",\"key\":\"Kster\"},{\"tag\":\"Kuole\\udter\",\"value\":\"master\",\"key\":\"Kule\"},{\"tag\":\"Name\\uwest-1a\",\"value\":\"st-1a\",\"key\":\"Name\"}]}"], :query_info=>{:select_fields=>[{:name=>"[FILTERED]"}, {:name=>"[FILTERED]"}, {:name=>"[FILTERED]"}]}, :next_token=>"YwutZrD0Ow9Qh3HoYbiC"} # 解析results里的JSON字符串为Ruby哈希 parsed_result = JSON.parse(json_hash[:results].first)
2. 提取目标键值对
因为instanceType在configuration下,所以要单独提取它,然后把所有需要的字段整理到一个新哈希里:
# 提取需要的字段 extracted_data = { 'resourceId' => parsed_result['resourceId'], 'instanceType' => parsed_result.dig('configuration', 'instanceType'), 'tags' => parsed_result['tags'] }
这里用dig方法可以安全地获取嵌套哈希的值,如果某个层级不存在也不会报错,比直接parsed_result['configuration']['instanceType']更稳妥。
3. 生成表格(以键为列标题)
如果是要输出Markdown格式的表格,我们可以把提取的数据整理成表格结构:
# 生成Markdown表格 table_header = extracted_data.keys.join(' | ') table_separator = extracted_data.keys.map { '---' }.join(' | ') # 处理tags字段,把数组转成可读性好的字符串 table_row = extracted_data.values.map do |val| val.is_a?(Array) ? val.map { |tag| "#{tag['key']}: #{tag['value']}" }.join('<br>') : val end.join(' | ') markdown_table = <<~TABLE | #{table_header} | | #{table_separator} | | #{table_row} | TABLE puts markdown_table
完整运行结果
运行上面的代码后,会输出如下Markdown表格:
| resourceId | instanceType | tags |
|---|---|---|
| i-5ee33 | m4.2xlarge | awsss: b-1a Kster: blu Kule: master Name: st-1a |
如果你需要生成其他格式的表格(比如终端里的ASCII表格),可以调整最后一步的输出逻辑,但核心的提取步骤是一样的。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

