【问题标题】:Convert Json structures(Json File) to Ruby hash将 Json 结构(Json 文件)转换为 Ruby 哈希
【发布时间】:2014-11-05 16:18:02
【问题描述】:

我有一个JSON File,看起来像:

{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 7, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"}
{"business_id": "JwUE5GmEO-sH1FuwJgKBlQ", "full_address": "6162 US Highway 51\nDe Forest, WI 53532", "hours": {}, "open": true, "categories": ["Restaurants"], "city": "De Forest", "review_count": 26, "name": "Pine Cone Restaurant", "neighborhoods": [], "longitude": -89.335843999999994, "state": "WI", "stars": 4.0, "latitude": 43.238892999999997, "attributes": {"Take-out": true, "Good For": {"dessert": false, "latenight": false, "lunch": true, "dinner": false, "breakfast": false, "brunch": false}, "Caters": false, "Noise Level": "average", "Takes Reservations": false, "Delivery": false, "Ambience": {"romantic": false, "intimate": false, "touristy": false, "hipster": false, "divey": false, "classy": false, "trendy": false, "upscale": false, "casual": false}, "Parking": {"garage": false, "street": false, "validated": false, "lot": true, "valet": false}, "Has TV": true, "Outdoor Seating": false, "Attire": "casual", "Alcohol": "none", "Waiter Service": true, "Accepts Credit Cards": true, "Good for Kids": true, "Good For Groups": true, "Price Range": 1}, "type": "business"}

我想遍历这个文件并将单个结构转换为 Ruby 哈希,以便我可以访问不同的哈希来对它们执行操作。

这是 JSON 文件第一个结构的哈希:

{"business_id"=>"uUsfpN81JCMKyH6c0D0bTg", "full_address"=>"1910 Village Center Cir\nSte 6\nSummerlin\nLas Vegas, NV 89134", "hours"=>{}, "open"=>true, "categories"=>["Food", "Desserts", "Italian", "Pizza", "Restaurants"], "city"=>"Las Vegas", "review_count"=>6, "name"=>"Rocco's NY Pizza & Pasta", "neighborhoods"=>["Summerlin"], "longitude"=>-115.3041999, }

同样,我想拥有所有其他 JSON 结构的哈希值。如何在 Ruby on Rails 中做到这一点?

【问题讨论】:

  • 不要使用链接指向回答问题所需的数据。当您的问题中的链接腐烂集变得无意义时,因为没有人能够说出您在谈论什么数据。相反,提供最小的数据样本,尽可能小以重现问题。

标签: ruby-on-rails ruby json hash


【解决方案1】:

你得到的文件不是 JSON 文件,而只是一个包含一堆 JSON 编码对象的文本文件。简单地遍历这些线。

require 'json'

File.read("file.txt").split("\n").each do |line|
  JSON.parse(line)
end

如果你想返回一个哈希数组,或者使用.map而不是.each

File.foreach("file.txt").map do |line|
  JSON.parse(line)
end

File.read("file.txt").split("\n").map do |line|
  JSON.parse(line)
end

另请注意这与 Rails 无关,它是纯 Ruby 代码

【讨论】:

  • 像魅力一样工作,非常感谢。还有一个问题,一个json文件会有逗号分隔的结构,或者你说它是一个文本文件?因为我从某个地方得到了这个文件,它有大约 25k 条记录并且有一个扩展名 json。
  • JSON 中的项目数组定义为[{ ... }, { ... }]
  • File.foreach(...)File.read(...).split("\n").each 快。
【解决方案2】:

这样的东西会返回一个从文件中检索到的哈希数组:

require 'json'

array_of_hashes = File.foreach('file.txt').map{ |l| JSON[l] }

但请注意,这是不可扩展的,因为您会将整个文件拉入内存,如果生成的数组大于可用空间,您将看到您的程序进入爬行状态。

一种更具可扩展性的方法是读取每一行,使用 JSON 解析器将其转换为 Ruby 对象,然后立即将生成的对象填充到数据库记录中,最后遍历数据库进行按摩。 SQLite3、PostgreSQL、MySQL 都是合理的选择。

【讨论】:

  • 好的,我同意你所说的。会记住的。谢谢:)
【解决方案3】:

你试过JSON.parse

   require 'json'
   JSON.parse(your_json) #=> your expected result

【讨论】:

  • 是的,我做到了。关注此article。如果有超过 1 个 json 结构,则会出错。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 2016-09-14
  • 1970-01-01
相关资源
最近更新 更多