用Ruby迭代JSON

用Ruby迭代JSON,ruby,json,Ruby,Json,我在一个名为JSON.JSON的文件中有JSON内容: { "ENAX-BRANCHESM-10" : { "repo":"test-ASO", "PATH":"/tmp/pruebaAlvaro", "ARTEFACTOS":"enax_phoneValidationCX-1.0.0.jar,enax_phoneValidationCX-1.0.0-sn.jar,enax_phoneValidationCX-1.0.0-facad

我在一个名为JSON.JSON的文件中有JSON内容:

{
    "ENAX-BRANCHESM-10" :
    {
        "repo":"test-ASO",
        "PATH":"/tmp/pruebaAlvaro",
        "ARTEFACTOS":"enax_phoneValidationCX-1.0.0.jar,enax_phoneValidationCX-1.0.0-sn.jar,enax_phoneValidationCX-1.0.0-facade.jar",
        "uri":"http://server:8081/artifactory/test-ASO",
        "created":"A705663"

    },
    "QZQP-QZQPMAN-16" : {
        "repo": "test-ASO",
        "PATH": "/tmp/pruebaAlvaro2",
        "ARTEFACTOS": "qzqp_manageApp.jar,qzqp_manageApp-sn.jar,qzqp_manageApp-facade.jar",
        "uri": "http://server:8081/artifactory/test-ASO",
        "created": "A705663"
    }
}
我试着这么做:

#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'uri'
require 'net/http'

fichero = File.read("./json.json")
parseo = JSON.parse(fichero)
valores = parseo.map { |_, v| { v[:PATH] => v[:ARTEFACTOS].split(',') } }
puts valores
但我得到了一个错误:

pruebas.rb:11: private method `split' called for nil:NilClass (NoMethodError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `map'
        from pruebas.rb:11:in `each'
        from pruebas.rb:11:in `map'
        from pruebas.rb:11
我的问题是,如何从JSON中获得这个输出

/tmp/pruebaAlvaro
enax_phoneValidationCX-1.0.0.jar

/tmp/pruebaAlvaro 
enax_phoneValidationCX-1.0.0-sn.jar

/tmp/pruebaAlvaro
enax_phoneValidationCX-1.0.0-facade.jar

/tmp/pruebaAlvaro2 
qzqp_manageApp.jar

/tmp/pruebaAlvaro2
qzqp_manageApp-sn.jar

/tmp/pruebaAlvaro2
qzqp_manageApp-facade.jar
parseo变量的内容包括:

QZQP-QZQPMAN-16createdA705663repotest-ASOurihttp://server:8081/artifactory/test-ASOARTEFACTOSqzqp_manageApp.jar,qzqp_manageApp-sn.jar,qzqp_manageApp-facade.jarPATH/tmp/pruebaAlvaro2ENAX-BRANCHESM-10createdA705663repotest-ASOurihttp://server:8081/artifactory/test-ASOARTEFACTOSenax_phoneValidationCX-1.0.0.jar,enax_phoneValidationCX-1.0.0-sn.jar,enax_phoneValidationCX-1.0.0-facade.jarPATH/tmp/pruebaAlvaro

这是正确的输出吗?可能是因为parseo.map需要一个不同的内容而失败,所以我得到了这个错误?我能做什么?

您正试图通过提供符号来访问字符串键。相反,将字符串传递给:[]方法,而不是符号v['PATH']和v['Artefacts']。

尝试以下操作:

myhash = Hash.new
valores = parseo.map { |_, v| myhash[v["PATH"]] = v["ARTEFACTOS"].split(',') }
puts myhash

#output:

{"/tmp/pruebaAlvaro"=>["enax_phoneValidationCX-1.0.0.jar", "enax_phoneValidationCX-1.0.0-sn.jar", "enax_phoneValidationCX-1.0.0-facade.jar"]}
{"/tmp/pruebaAlvaro2"=>["qzqp_manageApp.jar", "qzqp_manageApp-sn.jar", "qzqp_manageApp-facade.jar"]}
现在,如果您想访问任何特定路径,可以执行以下操作:

> myhash["/tmp/pruebaAlvaro"]
#=> ['enax_phoneValidationCX-1.0.0.jar', 'enax_phoneValidationCX-1.0.0-sn.jar', 'enax_phoneValidationCX-1.0.0-facade.jar']
抱歉,我刚刚注意到您的预期输出:

myhash.each do |k,v|
  v.each do |value|
    puts k
    puts value
    puts # to drop a blank line
  end
end
#output:
/tmp/pruebaAlvaro
enax_phoneValidationCX-1.0.0.jar

/tmp/pruebaAlvaro
enax_phoneValidationCX-1.0.0-sn.jar

/tmp/pruebaAlvaro
enax_phoneValidationCX-1.0.0-facade.jar

/tmp/pruebaAlvaro2
qzqp_manageApp.jar

/tmp/pruebaAlvaro2
qzqp_manageApp-sn.jar

/tmp/pruebaAlvaro2
qzqp_manageApp-facade.jar

那么代码是什么?valores=parseo.map{|{,v{:[]=>:[].split','}}我没有得到想要的输出。太棒了!这对我帮助很大!但是如何解析输出以获得所需的输出呢?有了您的解决方案,我得到的值包含以下内容:/tmp/pruebalvaroneax\u phoneValidationCX-1.0.0.jarenax\u phoneValidationCX-1.0.0-sn.jarenax\u phoneValidationCX-1.0.0-facade.jar/tmp/pruebalvarone2qzqp\u manageApp.jarqpzqp\u manageApp-sn.jarqpzqp\u manageApp\u manageApp-facade.jar通过数组我真的感觉糟透了:谢谢Gagan,我通过您的解决方案得到了这个输出:/tmp/pruebalvaro2qzqp_manageApp.jarqzqp_manageApp-sn.jarqzqp_manageApp-facade.jar/tmp/pruebalvaro2qzqp_电话验证cx-1.0.0.jarenax_电话验证cx-1.0.0-sn.jarenax电话验证cx-1.0.0-facade.jar顺便说一句,我使用的是ruby 1.8.7,它太老了,不能执行我想要的吗?@AlvaroGomezFolgado:我已经更新了我的答案,请检查now@AlvaroGomezFolgado:我已经用您的预期输出更新了我的答案:耶!你搞定了,谢谢你的努力@Gagan GamiI尝试了你的解决方案,放了几个类似的条目,似乎代码valores=parseo.map{| |,v |{v[:PATH]=>v[:artifactos].split','}会忽略一些值而随机运行,我试图修改代码,但我得到的只是语法错误。这个问题和你2小时前问的问题是一样的。不要那样做。你不能期望得到即时的回应,因为回答的人遍布世界各地,并且在业余时间致力于回答。事实上,这是你的另一个问题的重复,只是稍微改写了一下,并提供了更多的信息,我将其标记为这样。