0

我对 ruby​​ 编程和使用 json 包还是很陌生,我想我正面临一个典型的 noob 错误,但我现在两天都找不到我的错误。我是这样开始的:

require 'discogs-wrapper'
require 'json'

aw = Discogs::Wrapper.new("my_application", user_token: "my_user_token")
inv = aw.get_user_inventory('my_user_name', :per_page => 1, :page => 1)
p=JSON.parse(inv)

我收到的是这样的:

C:/Ruby24-x64/lib/ruby/2.4.0/json/common.rb:156:in `initialize': no implicit conversion of Hashie::Mash into String (TypeError)
from C:/Ruby24-x64/lib/ruby/2.4.0/json/common.rb:156:in `new'
from C:/Ruby24-x64/lib/ruby/2.4.0/json/common.rb:156:in `parse'
from C:/Users/rtuz2th/.RubyMine2017.3/config/scratches/scratch.rb:6:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'

我已经在搜索您的论坛,并且了解到这个错误可能意味着我没有正确的 JSON 文件(虽然它直接来自 discogs-api,但我基本上认为这些人知道他们在做什么)。所以我接下来尝试的是

require 'discogs-wrapper'
require 'json'

aw = Discogs::Wrapper.new("my_application", user_token: "my_user_token")
inv = aw.get_user_inventory('my_user_name', :per_page => 1, :page => 1)
inv = inv.to_json    
p=JSON.parse(inv)

所以至少,我的代码现在运行没有任何错误。但是当我尝试引用 inv 中的任何信息时,我只会得到空的响应。inv (没有 .to_json 看起来像这样:

  {"pagination"=>
  {"per_page"=>1,
   "items"=>13692,
   "page"=>1,
   "urls"=>
    {"last"=>
      "URL containing tokens",
     "next"=>
      "URL containing tokens"},
   "pages"=>13692},
 "listings"=>
  [{"status"=>"Draft",
    "original_price"=>
     {"curr_abbr"=>"EUR",
      "formatted"=>"\u20AC10.46",
      "value"=>10.46,
      "curr_id"=>3},
    "weight"=>230.0,
    "original_shipping_price"=>
     {"curr_abbr"=>"EUR",
      "formatted"=>"\u20AC5.90",
      "value"=>5.9,
      "curr_id"=>3},
    "price"=>{"currency"=>"EUR", "value"=>10.46},
    "allow_offers"=>true,
    "uri"=>"https://www.discogs.com/sell/item/437965910",
    "sleeve_condition"=>"Very Good Plus (VG+)",
    "format_quantity"=>1,
    "id"=>437965910,
    "shipping_price"=>{"currency"=>"EUR", "value"=>5.9},
    "posted"=>"2017-02-07T23:43:01-08:00",
    "ships_from"=>"Germany",
    "in_cart"=>false,
    "comments"=>"",
    "seller"=>
     {"username"=>"zweischeiben.de",
      "stats"=>{"rating"=>"100.0", "total"=>143, "stars"=>5.0},
      "uid"=>3359767,
      "url"=>"https://api.discogs.com/users/zweischeiben.de",
      "html_url"=>"https://www.discogs.com/user/zweischeiben.de",
      "shipping"=>
       "(Lots of information about shipping, cut just cut it out)"
      "payment"=>"Bank Transfer, PayPal",
      "avatar_url"=>
       "(cut out url)",
      "resource_url"=>"https://api.discogs.com/users/zweischeiben.de",
      "id"=>3359767},
    "condition"=>"Near Mint (NM or M-)",
    "release"=>
     {"thumbnail"=>
       "(cut out url)",
      "description"=>"Steamhammer - Mountains (LP, Album, RE)",
      "artist"=>"Steamhammer",
      "format"=>"LP, Album, RE",
      "resource_url"=>"https://api.discogs.com/releases/7303333",
      "title"=>"Mountains",
      "year"=>0,
      "id"=>7303333,
      "catalog_number"=>"201.006, 0201.006"},
                        "resource_url"=>"https://api.discogs.com/marketplace/listings/437965910",
"audio"=>false,
"external_id"=>"3, 16",
"location"=>"T52574"}]}

但是,如果我现在尝试参考例如位置:

require 'discogs-wrapper'
require 'json'

aw = Discogs::Wrapper.new("my_application", user_token: "my_token")
inv=aw.get_user_inventory('my_username', :per_page => 1, :page => 1)
inv=inv.to_json
p=JSON.parse(inv)
puts p[location]

我只是收到这样的错误

C:\Ruby24-x64\bin\ruby.exe -e     $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)             C:/Users/rtuz2th/.RubyMine2017.3/config/scratches/scratch.rb
C:/Users/rtuz2th/.RubyMine2017.3/config/scratches/scratch.rb:9:in `<top (required)>': undefined local variable or method `location' for main:Object (NameError)
from -e:1:in `load'
from -e:1:in `<main>'

Process finished with exit code 1

或空响应。我现在正在尝试解决这个问题两天,但我完全没有想法。提前感谢您的帮助!

4

1 回答 1

1
inv = inv.to_json
p = JSON.parse(inv)

上面是一个noop。inv按原样使用,它已经是一个哈希。


puts p[location]

您不能只查找位于树层次结构深处的任何键或散列。你散列有 stings 作为键,它有两个顶级元素,'pagination''listings',后者是一个数组,这个数组的每个元素都是一个有location键的散列。


当您削减长值时,您删除了结尾逗号,使我无法复制粘贴输入并提供确切答案。

于 2018-01-09T19:54:37.643 回答