【问题标题】:Iterate JSON with Ruby [duplicate]用 Ruby 迭代 JSON [重复]
【发布时间】:2015-09-14 10:26:36
【问题描述】:

我在一个名为“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 需要不同的内容并且失败了?我能做什么?

【问题讨论】:

  • 此问题与您 2 小时前提出的问题相同。不要那样做。您不能指望即时响应,因为回答的人遍布世界各地,并在业余时间致力于回答。照原样,这是您的另一个问题的副本(尽管略有改写并提供了更多信息),我将其标记为这样。

标签: ruby json


【解决方案1】:

试试这个:

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"]}

现在,如果您想访问任何特定的“PATH”,那么可以这样做:

> 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

【讨论】:

  • 谢谢 Gagan,我正在使用您的解决方案获得以下输出:/tmp/pruebaAlvaro2qzqp_manageApp.jarqzqp_manageApp-sn.jarqzqp_manageApp-facade.jar /tmp/pruebaAlvaroenax_phoneValidationCX-1.0.0.jarenax_phoneValidationCX-1.0.0-sn.jarenax_phoneValidationCX-1.0.0-facade.jar BTW 我使用的是 ruby​​ 1.8.7,它是否太旧而无法执行我想要的操作?
  • @AlvaroGomezFolgado:我已经更新了我的答案,请立即查看
  • @AlvaroGomezFolgado :我已经用您的预期输出更新了我的答案:
  • 耶!你搞定了,谢谢你所有的努力@Gagan Gami
  • 我尝试了您的解决方案,并放置了几个类似的条目,似乎代码 valores = parseo.map { |_, v| { v[:PATH] => v[:ARTEFACTOS].split(',') } } 通过忽略某些值随机运行,我试图修改该代码,但我得到的只是语法错误跨度>
【解决方案2】:

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

【讨论】:

  • 那么代码是什么?价值 = parseo.map { |_, v| { :[] => :[].split(',') } } 我没有得到想要的输出
  • 没有。 parseo.map { |_, v| { v['PATH'] => v['ARTEFACTOS'].split(',') } }
  • 太棒了!这对我帮助很大!但是如何解析输出以获得所需的输出?有了你的解决方案,我知道“值”有这个内容:/tmp/pruebaAlvaroenax_phoneValidationCX-1.0.0.jarenax_phoneValidationCX-1.0.0-sn.jarenax_phoneValidationCX-1.0.0-facade.jar /tmp/pruebaAlvaro2qzqp_manageApp.jarqzqp_manageApp-sn.jarqzqp_manageApp-facade.jar我真的很糟糕通过数组:(
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2018-01-27
  • 2016-10-24
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多