在Ruby中解析JSON文件并从嵌套哈希中提取数字

在Ruby中解析JSON文件并从嵌套哈希中提取数字,json,ruby,parsing,Json,Ruby,Parsing,现在我正在用Ruby从JSON文件中提取信息。那么如何从下面的文本文件中提取单词“score”旁边的数字呢?例如,我希望获得0.6748984055823062、0.6280145725181376,并继续 { "sentiment_analysis": [ { "positive": [ { "sentiment": "Popular", "topic": "games", "score": 0

现在我正在用Ruby从JSON文件中提取信息。那么如何从下面的文本文件中提取单词“score”旁边的数字呢?例如,我希望获得0.6748984055823062、0.6280145725181376,并继续

{
  "sentiment_analysis": [
    {
      "positive": [
        {
          "sentiment": "Popular",
          "topic": "games",
          "score": 0.6748984055823062,
          "original_text": "Popular games",
          "original_length": 13,
          "normalized_text": "Popular games",
          "normalized_length": 13,
          "offset": 0
        },
        {
          "sentiment": "engaging",
          "topic": "pop culture-inspired games",
          "score": 0.6280145725181376,
          "original_text": "engaging pop culture-inspired games",
          "original_length": 35,
          "normalized_text": "engaging pop culture-inspired games",
          "normalized_length": 35,
          "offset": 370
        },
     "negative": [
    {
      "sentiment": "get sucked into",
      "topic": "the idea of planning",
      "score": -0.7923352042939829,
      "original_text": "Students get sucked into the idea of planning",
      "original_length": 45,
      "normalized_text": "Students get sucked into the idea of planning",
      "normalized_length": 45,
      "offset": 342
    },
    {
      "sentiment": "be daunted",
      "topic": null,
      "score": -0.5734506634410159,
      "original_text": "initially be daunted",
      "original_length": 20,
      "normalized_text": "initially be daunted",
      "normalized_length": 20,
      "offset": 2104
    },
我尝试的是,我可以读取一个文件,并使用JSON方法将文本文件设置为哈希变量

require 'json'
json = JSON.parse(json_string)
您可以使用
Array#map
收集评论

reviews = json['sentiment_analysis'][0]
positive_reviews = reviews['positive']
negative_reviews = reviews['negative']

positive_reviews.map { |review| review['score'] }
=> [0.6748984055823062, 0.6280145725181376]

negative_reviews.map { |review| review['score'] }
=> [-0.7923352042939829, -0.5734506634410159]

希望这有帮助

使用
JSON
类:

导入文件:

require "json"
file = File.open "/path/to/your/file.json"
data = JSON.load file
(可选)您现在可以关闭它:

file.close
该文件如下所示:

{
  "title": "Facebook",
  "url": "https://www.facebook.com",
  "posts": [
    "lemon-car",
    "dead-memes"
  ]
}
data["title"]
=> "Facebook"
data.keys
=> ["title", "url", "posts"]
data['posts']
=> ["lemon-car", "dead-memes"]
data["url"]
=> "https://www.facebook.com"
现在可以像这样读取该文件:

{
  "title": "Facebook",
  "url": "https://www.facebook.com",
  "posts": [
    "lemon-car",
    "dead-memes"
  ]
}
data["title"]
=> "Facebook"
data.keys
=> ["title", "url", "posts"]
data['posts']
=> ["lemon-car", "dead-memes"]
data["url"]
=> "https://www.facebook.com"
希望这有帮助

解析文件中的数据
data\u hash=JSON.parse(File.read('File-name-to-be-read.JSON'))

然后只需映射数据即可

reviews = data_hash['sentiment_analysis'].first
reviews.map do |sentiment, reviews|
  puts "#{sentiment} #{reviews.map { |review| review['score'] }}"
end

我认为这是最简单的答案

正如你所建议的那样,它起了很大的作用。非常感谢。你能解释一下[0]在json[“情绪分析”][0][“积极”中的含义吗?
json[“情绪分析”]
包含一个对象数组,你要查找的数据显示在第一个索引中。因此,您可以使用[0]索引到对象中,然后解析
“positives”
对象。这有意义吗?好的,我明白了。那你能再看一下上面的文本文件吗?我在文本中添加了更多的“否定”。在这种情况下,我应该使用json['touction_analysis'][0]['negative']还是json['touction_analysis'][1]['negative']?@sookej更新了答案。看一看,让我知道它是否有帮助。这是基于,其中选择的答案解释了如何对数组中的第一个元素执行此操作。基于此,你尝试过什么?您需要弄清楚如何迭代数组。请阅读包含链接页面的“”以及“”,您不应使用
文件。阅读
,这会将整个文件加载到内存中<代码>文件。打开
可以与
JSON一起工作。加载
。如果这是您选择的选项,请不要忘记
文件。关闭
!您需要
JSON.load
而不是
JSON.parse
,parse只接受一个字符串,load将接受一个文件。你还需要
而不是include>而需要“json”
。是的,但是你不知道如何阅读它,除了在IRB@MichalŠtein-这个答案似乎很简单,可以处理关闭文件的问题(你的答案没有)-请解释你对这个答案的担忧?答案没有说明加载后该做什么。我要加上文件关闭,这是个好主意。