ruby
  • json
  • hash
  • 2014-12-09 4 views 5 likes 
    5

    Versuchen, einige JSON zu analysieren, warum ist text leer?Ruby - TypeError: keine implizite Konvertierung von Hash in String

    gewünschte Ausgabe:

    text sollte 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 
    

    Stromausgang zurück:

    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> 
    
    +1

    Ich bin nicht vertraut mit 'to_sentence'. Kannst du das erklären? – squiguy

    +0

    'NoMethodError: undefinierte Methode to_sentence 'für # ' benutzt du einen Edelstein? – shivam

    +3

    'to_sentence' ist' ActiveSupport' [Methode] (http://apidock.com/rails/ActiveSupport/CoreExtensions/Array/Conversions/to_sentence) in Rails verfügbar. Außerdem ist es auf Array, nicht auf Hash, abrufbar. – kiddorails

    Antwort

    6

    Der Fehler ist ein Ergebnis der Array#to_sentence auf einem Hash-Aufruf.

    Hier ist eine Fest-up-Version mit Kommentaren die Änderungen angibt:

    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 
    

    Ausgang:

    Hello world 
    
    Apple, Harbor 
    
    Banana, Kitchen 
    
    Mango, Bedroom 
    
    +2

    Es wäre nett, eine begleitende Erklärung zu haben, was das Problem eigentlich ist. – JohnDoe

    1

    In-Fall Ihre json immer "Früchte" Schlüssel enthält, können Sie diese leicht ganz erreichen können . Hier:

    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']}" 
    } 
    

    Ein anderer Weg, dies zu tun, ohne fruits Schlüssel:

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