用Ruby迭代JSON
我在一个名为JSON.JSON的文件中有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
{
"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小时前问的问题是一样的。不要那样做。你不能期望得到即时的回应,因为回答的人遍布世界各地,并且在业余时间致力于回答。事实上,这是你的另一个问题的重复,只是稍微改写了一下,并提供了更多的信息,我将其标记为这样。