使用Ruby解析JSON对象时出错

时间:2012-10-08 20:03:32

标签: ruby json

我正在尝试使用以下代码解析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."
        },

任何人都可以告诉我我做错了什么以及如何解决它?

1 个答案:

答案 0 :(得分:3)

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

正确的做法取决于json的其余部分 - 如果你只是想拉出那个网址,那么

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

应该做的伎俩。如果您确实希望迭代commands,那么

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

比使用单个块参数(数组

)更容易使用