我一直在从 JSON 格式的 API 中提取数据,目前遇到了一个基本问题
数据位于 Google 和 Facebook 等公司上,并且位于数组或哈希中,如下所示:
[
{"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>GOOG, "primary_role"=>"company"}},
{"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>FB, "primary_role"=>"company"}}
]
以下是我想尝试的两个操作:
有什么想法吗?
我是 Ruby 的初学者,但遇到了数组和哈希的某些函数/方法(例如未定义的方法)的问题,因为这看起来是一个哈希数组
谢谢!
Ruby 提供了一些工具来帮助我们理解数组、哈希以及两者的嵌套混合。
假设您的数据如下所示(我在
GOOG
和 FB
周围添加了引号):
data = [
{"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}},
{"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}
]
each
迭代数组,例如:
data.each do |result|
puts result["id"]
end
挖掘哈希并打印结果可以通过多种方式完成:
data.each do |result|
# method 1
puts result["properties"]["name"]
# method 2
puts result.dig("properties", "name")
end
hash[key]
语法,并且由于第一个哈希值是另一个哈希,因此可以将其链接起来以获得您想要的结果。这种方法的缺点是,如果您的其中一个结果缺少 properties
键,您将收到错误消息。
dig
,它接受嵌套键作为参数(按顺序)。它会深入挖掘嵌套的哈希值并提取值,但如果缺少任何步骤,它将返回nil
,如果您正在处理来自外部源的数据,这会更安全一些
你的第二个问题有点复杂。您有两个选择:
primary_role
键,或者 primary_role
键之外的所有数据。我通常会选择后者,并建议阅读不可变性和不可变数据结构。
delete
:
data.each do |company|
company["properties"].delete("primary_role")
end
hash[key] = value
即可分配新的哈希值,因此您可以使用以下内容设置行业:
data.each do |company|
company["properties"]["industry"] = "Advertising/Privacy Invasion"
end
这会给你留下类似的东西:
[
{
"id"=>"1",
"properties"=>{
"name"=>"Google",
"stock_symbol"=>"GOOG",
"industry"=>"Advertising/Privacy Invasion"
}
},
{
"id"=>"2",
"properties"=>{
"name"=>"Facebook",
"stock_symbol"=>"FB",
"industry"=>"Advertising/Privacy Invasion"
}
}
]
要实现第一个操作,您可以迭代公司数组并访问每个公司的相关信息。这是 Ruby 中的示例:
companies = [ {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}}, {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}]
companies.each do |company|
name = company['properties']['name']
id = company['id']
stock_symbol = company['properties']['stock_symbol']
puts "#{name} - #{id} - #{stock_symbol}"
end
这将打印出每家公司的名称、ID 和股票代码。
要删除“主要角色”键/值,您可以在属性哈希上使用删除方法。例如:
companies.each do |company|
company['properties'].delete('primary_role')
end
要添加新的“行业”键/值,您可以使用 []= 运算符将新的键/值对添加到属性哈希中。例如:
companies.each do |company|
company['properties']['industry'] = 'Technology'
end
这将为每个公司的属性哈希添加一个新的键/值对,其中键为“行业”,值“技术”。