如何从嵌套的JSON中提取值?

时间:2013-11-30 16:53:13

标签: ruby json parsing csv

解析一些JSON之后:

data = JSON.parse(data)['info']
puts data

我明白了:

[
{
"title"=>"CEO",
"name"=>"George",
"columns"=>[
{
"display_name"=> "Salary",
"value"=>"3.85",
}
, {
"display_name"=> "Bonus",
"value"=>"994.19",
}
, {
"display_name"=> "Increment",
"value"=>"8.15",
}
]
}
]

columns已嵌套数据。

我想将数据保存在数据库或CSV文件中。

title, name, value_Salary, value_Bonus, value_increment

但是我并不关心获取display_name,所以只关注第一列的值,第二列的数据等等。

好的我在转换为hash& amp;之后尝试了data.map hash.flatten可以找到出路.. .map {| x | X [ '列']} .map {| s | S [ “值”]} 试图分别得到这些价值 - 但不能......

1 个答案:

答案 0 :(得分:0)

这是一个简单的问题,可以解析为几个嵌套的map块。

以下是从JSON检索到的数据,以及一个额外的行来演示处理更复杂的JSON响应是多么容易:

data = [
  {
    "title"   => "CEO",
    "name"    => "George",
    "columns" => [
      {
        "display_name" => "Salary",
        "value"        => "3.85",
      },
      {
        "display_name" => "Bonus",
        "value"        => "994.19",
      },
      {
        "display_name" => "Increment",
        "value"        => "8.15",
      }
    ]
  },
  {
    "title"   => "CIO",
    "name"    => "Fred",
    "columns" => [
      {
        "display_name" => "Salary",
        "value"        => "3.84",
      },
      {
        "display_name" => "Bonus",
        "value"        => "994.20",
      },
      {
        "display_name" => "Increment",
        "value"        => "8.15",
      }
    ]
  }
]

以下是代码:

records = data.map { |record|
  title, name = record.values_at('title', 'name')
  values = record['columns'].map{ |column| column['value'] }

  [title, name, *values]
}

这是结果数据结构,一个数组数组:

records
# => [["CEO", "George", "3.85", "994.19", "8.15"],
#     ["CIO", "Fred", "3.84", "994.20", "8.15"]]

将它保存到数据库或CSV留给你去弄清楚,但Ruby的CSV类使编写文件变得微不足道,像Sequel之类的ORM使它真正很容易将数据插入数据库。