json Ruby - TypeError:没有将哈希隐式转换为字符串

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27372255/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 17:40:23  来源:igfitidea点击:

Ruby - TypeError: no implicit conversion of Hash into String

rubyjsonhash

提问by Mark Boulder

Trying to parse some JSON, byt why is textempty?

试图解析一些 JSON,为什么是text空的?

Desired output:

期望的输出:

textshould return Hello world\n\nApple, Harbor\n\nBanana, Kitchen\n\nMango, Bedroom

text应该回来 Hello world\n\nApple, Harbor\n\nBanana, Kitchen\n\nMango, Bedroom

text = "Hello world"

json = '{"fruits": [{"name": "Apple", "location": "Harbor"}, {"name": "Banana", "location": "Kitchen"}, {"name": "Mango", "location": "Bedroom"}]}'
fruits = JSON.parse(json)

def format_fruits(fruits)
  fruits.each do |fruit|
    puts "\n\n#{ fruit[0]['name'] }, #{ fruit[0]['location'] }"
  end.to_sentence
end

text += format_fruits(fruits)
text

Current output:

电流输出:

TypeError: no implicit conversion of Hash into String
        from (irb):5:in `+'
        from (irb):5
        from /home/mark/.gem/ruby/2.1.1/gems/railties-4.1.7/lib/rails/commands/console.rb:90:in `start'
        from /home/mark/.gem/ruby/2.1.1/gems/railties-4.1.7/lib/rails/commands/console.rb:9:in `start'
        from /home/mark/.gem/ruby/2.1.1/gems/railties-4.1.7/lib/rails/commands/commands_tasks.rb:69:in `console'
        from /home/mark/.gem/ruby/2.1.1/gems/railties-4.1.7/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
        from /home/mark/.gem/ruby/2.1.1/gems/railties-4.1.7/lib/rails/commands.rb:17:in `<top (required)>'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:247:in `require'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:247:in `block in require'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:232:in `load_dependency'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:247:in `require'
        from /home/mark/myapp/bin/rails:8:in `<top (required)>'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:241:in `load'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:241:in `block in load'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:232:in `load_dependency'
        from /home/mark/.gem/ruby/2.1.1/gems/activesupport-4.1.7/lib/active_support/dependencies.rb:241:in `load'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/commands/rails.rb:6:in `call'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/command_wrapper.rb:38:in `call'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:180:in `block in serve'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:153:in `fork'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:153:in `serve'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:128:in `block in run'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in `loop'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in `run'
        from /home/mark/.gem/ruby/2.1.1/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in `<top (required)>'
        from /home/mark/.rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/mark/.rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'irb(main):006:0> text
=> "Hello world"
irb(main):007:0>

采纳答案by Matt

The error is a result of calling Array#to_sentenceon a hash.

该错误是调用Array#to_sentence散列的结果。

Here's a fixed-up version with comments denoting the changes:

这是一个修复版本,带有表示更改的注释:

require 'json'

text = "Hello world"

json = '{"fruits": [{"name": "Apple", "location": "Harbor"}, {"name": "Banana", "location": "Kitchen"}, {"name": "Mango", "location": "Bedroom"}]}'
fruits = JSON.parse(json)['fruits'] # append ['fruits']

def format_fruits(fruits)
  fruits.map do |fruit| # change each -> map
    "\n\n#{ fruit['name'] }, #{ fruit['location'] }" # delete puts, [0]
  end.join # change to_sentence -> join
end

text += format_fruits(fruits)
puts text

Output:

输出:

Hello world

Apple, Harbor

Banana, Kitchen

Mango, Bedroom

回答by shivam

In-case your json always contains "fruits" key, you can achieve this quite easily. Here:

如果你的 json 总是包含“fruits”键,你可以很容易地做到这一点。这里:

fruits = JSON.parse(json)
#=> {"fruits"=>[{"name"=>"Apple", "location"=>"Harbor"}, {"name"=>"Banana", "location"=>"Kitchen"}, {"name"=>"Mango", "location"=>"Bedroom"}]}

fruits["fruits"].each { |hash|
  puts "\n\n#{hash['name']}, #{hash['location']}"
}

Another way to do this without using fruitskey:

另一种不使用fruits密钥的方法:

fruits.values.first.each { |hash|
  puts "\n\n#{hash['name']}, #{hash['location']}"
}