1

我正在尝试使用以下代码解析 ruby​​ 中的 JSON 对象:

def parseUrls(mFile, dirname)


    f = File.open(File.join(dirname, mFile), 'r') 
    mF = f.read

    json = JSON.parse(mF)

    commands = json["commands"]
    #puts commands

    commands.each do |url|
        puts url

        mUrl = url["#EXAMPLE_DOCUMENTATION_CALL"]["URL"]
        puts mUrl

        #mString = String.new(DMMSERVER)
        #i = mString.count(DMMSERVER)
        #mUrl = mString.insert(i, tUrl)

        #puts mUrl

    end

但我不断收到此错误:

    TypeError: can't convert String into Integer
                  [] at org/jruby/RubyArray.java:1348
           parseUrls at ./fileParser.rb:48
                each at org/jruby/RubyHash.java:1181
           parseUrls at ./fileParser.rb:45
  sendServiceRequest at testmdxservices.rb:31
             getFile at testmdxservices.rb:20
                each at org/jruby/RubyArray.java:1620
             getFile at testmdxservices.rb:17
              (root) at testmdxservices.rb:39

使用这个 JSON:

"commands":{
        "#EXAMPLE_DOCUMENTATION_CALL":{
            "TYPE"  : "this is the server set we are comunicating with. example DMM, WDPRO, GOREG, ONESOURCE..etc if you don't know what these are ask some one from the team or look at QUICNY",
            "URL"   : "the full url of the call that will be turned into an http header",
            "METHOD": "this is a flag that tells the user what kind of call in http to make. 0 = post, 1 = get, 2 = postmulti  See int/uie_HttpRequests.ent for complete",
            "BODY": "this is the body of the http call depending on the call type this will change or not exist often with things that need to be filled in about it.",
            "NOTE": "comment section for information about how to use or what to expect when making this call."
        },

谁能告诉我我做错了什么以及如何解决?

4

1 回答 1

3

commands是一个散列,因此块产生的值是一个两元素数组,[key,value]而我认为你假设你传递的只是值。因此url是一个数组,所以当你请求时,ruby 不知道该怎么做url['#EXAMPLE_DOCUMENTATION_CALL']

正确的做法取决于 json 的其余部分是什么样的——如果你只想提取那个 url,那么

commands['#EXAMPLE_DOCUMENTATION_CALL']['URL']

应该做的伎俩。如果你确实想遍历commands然后

commands.each |key, value| do
  ...
end

比拥有一个数组的单个块参数更容易使用

于 2012-10-08T20:44:35.667 回答